Maison >développement back-end >tutoriel php >Exemple d'explication de PHP 7.1 utilisant OpenSSL au lieu du cryptage et du décryptage Mcrypt
Mcrypt peut être fréquemment utilisé par certains développeurs WeChat, mais Mcrypt est obsolète dans PHP 7.1. Existe-t-il d'autres alternatives ? Cet article vous présentera les informations pertinentes sur l'utilisation d'OpenSSL au lieu du cryptage et du déchiffrement Mcrypt dans PHP 7.1. J'espère qu'il vous sera utile.
Résumé :
Après la sortie de php7.1, les nouvelles fonctionnalités ont attiré de nombreux PHPers, et tout le monde discute de ce que les nouvelles fonctionnalités apporteront des avantages et des commodités. Cependant, la mise à niveau de php7.0 vers php7.1 rend obsolète (obsolète) une extension qui était couramment utilisée dans le passé (extension mcrypt). Le responsable fournit des conseils de solution correspondants, mais ne fournit pas de solutions plus détaillées. Alors voici le piège :
Aujourd'hui, lorsque j'utilisais la plateforme ouverte WeChat pour me connecter à un système de gestion de contenu, cela échouait constamment lors de la liaison du compte officiel
Raison :
Lors du débogage, nous avons constaté que la cause directe est l'événement d'autorisation renseigné dans la plateforme ouverte (l'événement d'autorisation enverra un événement toutes les dix minutes pour mettre à jour le ticket), c'est-à-dire :
L'URL renseignée ici. Après le débogage, il a été constaté que cette URL était correcte toutes les 10 minutes, mais le ticket n'a pas été reçu. jusqu'à la fin. En regardant le code, j'ai découvert que c'était dû au décryptage. Une erreur a été signalée lorsque les données provenaient de WeChat :
<?php function aes_decode($message, $encodingaeskey = '', $appid = '') { $key = base64_decode($encodingaeskey . '='); $ciphertext_dec = base64_decode($message); $iv = substr($key, 0, 16); $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($module, $key, $iv); $decrypted = mdecrypt_generic($module, $ciphertext_dec); mcrypt_generic_deinit($module); mcrypt_module_close($module); $pad = ord(substr($decrypted, -1)); if ($pad < 1 || $pad > 32) { $pad = 0; }
Solution :
Le code ci-dessus peut donc être modifié en :
<?php function aes_decode($message, $encodingaeskey = '', $appid = '') { $key = base64_decode($encodingaeskey . '='); $ciphertext_dec = base64_decode($message); $iv = substr($key, 0, 16); /* mcrypt对称解密代码在PHP7.1已经被抛弃了,所以使用下面的openssl来代替 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($module, $key, $iv); $decrypted = mdecrypt_generic($module, $ciphertext_dec); mcrypt_generic_deinit($module); mcrypt_module_close($module); */ $decrypted = openssl_decrypt($ciphertext_dec, 'AES-256-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); $pad = ord(substr($decrypted, -1)); if ($pad < 1 || $pad > 32) { $pad = 0; }
Supplément :
est le suivant :
<?php function aes_encode($message, $encodingaeskey = '', $appid = '') { $key = base64_decode($encodingaeskey . '='); $text = random(16) . pack("N", strlen($message)) . $message . $appid; $iv = substr($key, 0, 16); $block_size = 32; $text_length = strlen($text); $amount_to_pad = $block_size - ($text_length % $block_size); if ($amount_to_pad == 0) { $amount_to_pad = $block_size; } $pad_chr = chr($amount_to_pad); $tmp = ''; for ($index = 0; $index < $amount_to_pad; $index++) { $tmp .= $pad_chr; } $text = $text . $tmp; $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($module, $key, $iv); $encrypted = mcrypt_generic($module, $text); mcrypt_generic_deinit($module); mcrypt_module_close($module); $encrypt_msg = base64_encode($encrypted); return $encrypt_msg; }
<.>
<?php function aes_encode($message, $encodingaeskey = '', $appid = '') { $key = base64_decode($encodingaeskey . '='); $text = random(16) . pack("N", strlen($message)) . $message . $appid; $iv = substr($key, 0, 16); $block_size = 32; $text_length = strlen($text); $amount_to_pad = $block_size - ($text_length % $block_size); if ($amount_to_pad == 0) { $amount_to_pad = $block_size; } $pad_chr = chr($amount_to_pad); $tmp = ''; for ($index = 0; $index < $amount_to_pad; $index++) { $tmp .= $pad_chr; } $text = $text . $tmp; /* mcrypt对称加密代码在PHP7.1已经被抛弃了,所以使用下面的openssl来代替 $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($module, $key, $iv); $encrypted = mcrypt_generic($module, $text); mcrypt_generic_deinit($module); mcrypt_module_close($module); */ $encrypted = openssl_encrypt($text, 'AES-256-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); $encrypt_msg = base64_encode($encrypted); return $encrypt_msg; }
Spécial note : Tout processus impliquant le développement de WeChat, Si vous avez mis à niveau vers PHP 7.1, il est nécessaire de vérifier si Mcrypt est utilisé pour le cryptage et le décryptage symétriques. La démo utilisée dans la documentation de développement WeChat utilise également Mcrypt pour le cryptage. et le décryptage. Cela doit être noté.
Recommandations associées :Classe d'encapsulation de l'interface PHP WeChat_Tutoriel PHP
Petite expérience de développement de la plateforme de développement php WeChat
Classe de paiement PHP WeChat demo_php instance
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!