Maison  >  Article  >  développement back-end  >  Exemple d'explication de PHP 7.1 utilisant OpenSSL au lieu du cryptage et du décryptage Mcrypt

Exemple d'explication de PHP 7.1 utilisant OpenSSL au lieu du cryptage et du décryptage Mcrypt

*文
*文original
2017-12-25 10:19:541247parcourir

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 = &#39;&#39;, $appid = &#39;&#39;) { 
 $key = base64_decode($encodingaeskey . &#39;=&#39;); 
 $ciphertext_dec = base64_decode($message); 
 $iv = substr($key, 0, 16); 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;); 
 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; 
 }


Autrement dit, c'est ici. Puisque mon environnement est PHP 7.1, je dois rechercher des informations. Il a été constaté que PHP 7.1 a abandonné Mcrypt, donc mcrypt_* dans ce code ne peut pas être exécuté.

Solution :

La recherche d'informations a révélé que Mcrypt peut être remplacé par OpenSSL (à condition que l'extension OpenSSL ait été installée, mais généralement ils sont tous installés par défaut)

openssl est une boîte à outils puissante qui intègre de nombreux algorithmes cryptographiques et outils pratiques. Nous pouvons utiliser l'outil de console de commande qu'il fournit pour générer des clés et des certificats pour crypter et déchiffrer les fichiers, ou nous pouvons utiliser l'interface API qu'il fournit pour crypter les informations transmises dans le code.

Le code ci-dessus peut donc être modifié en :


<?php 
function aes_decode($message, $encodingaeskey = &#39;&#39;, $appid = &#39;&#39;) { 
 $key = base64_decode($encodingaeskey . &#39;=&#39;); 
 $ciphertext_dec = base64_decode($message); 
 $iv = substr($key, 0, 16); 
 /* mcrypt对称解密代码在PHP7.1已经被抛弃了,所以使用下面的openssl来代替 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;); 
 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, &#39;AES-256-CBC&#39;, $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); 
 
 $pad = ord(substr($decrypted, -1)); 
 if ($pad < 1 || $pad > 32) { 
 $pad = 0; 
 }


Supplément :

Le décryptage ci-dessus a été modifié, donc le cryptage Mcrypt correspondant doit également être modifié. S'il n'est pas modifié, cela entraînera le. impossibilité de publier l'ensemble du réseau et impossibilité de transmettre des messages. Le code source crypté pour des événements tels que

est le suivant :


<?php 
function aes_encode($message, $encodingaeskey = &#39;&#39;, $appid = &#39;&#39;) { 
 $key = base64_decode($encodingaeskey . &#39;=&#39;); 
 $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 = &#39;&#39;; 
 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, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;); 
 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; 
}

<.>

Le code modifié est :


<?php 
function aes_encode($message, $encodingaeskey = &#39;&#39;, $appid = &#39;&#39;) { 
 $key = base64_decode($encodingaeskey . &#39;=&#39;); 
 $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 = &#39;&#39;; 
 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, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;); 
 mcrypt_generic_init($module, $key, $iv); 
 $encrypted = mcrypt_generic($module, $text); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 */ 
 
 $encrypted = openssl_encrypt($text, &#39;AES-256-CBC&#39;, $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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn