Récemment, alors que j'utilisais PHP pour développer la fonction de compte public WeChat, j'ai découvert que Mcrypt était obsolète dans PHP 7.1. Je n'avais d'autre choix que de trouver un correspondant. solution pour le remplacer, donc Cet article vous présente principalement les informations pertinentes sur l'utilisation d'OpenSSL au lieu du cryptage et du déchiffrement Mcrypt dans PHP 7.1. Les amis dans le besoin peuvent s'y référer.
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 a fourni des conseils de solution correspondants, mais n'a pas fourni 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é.
RésuméCe qui précède est tout le contenu de cet article, j'espère qu'il sera utile à tout le monde dans le développement de WeChat si vous l'avez fait. Si vous avez des questions, veuillez nous contacter Posez des questions dans la communauté Q&A sur ce site !
Recommandations associées :
Schéma de remplacement pour le cryptage et le décryptage AES mcrypt_module_open() en php7. 1
exemple de code de cryptage et de décryptage php mcryptméthode de cryptage et de décryptage php basée sur opensslCe 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!