Explication détaillée de la façon d'utiliser OpenSSL au lieu du cryptage et du déchiffrement Mcrypt dans les astuces PHP 7.1_php

韦小宝
Libérer: 2023-03-17 18:28:01
original
2007 Les gens l'ont consulté

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 = &#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; 
 }
Copier après la connexion

<🎜. >

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; 
 }
Copier après la connexion


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; 
}
Copier après la connexion

<. 🎜>

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; 
}
Copier après la connexion


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 mcrypt

méthode de cryptage et de décryptage php basée sur openssl

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal