Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung zur Verwendung von OpenSSL anstelle von Mcrypt-Verschlüsselung und -Entschlüsselung in PHP 7.1_php-Tipps

Ausführliche Erklärung zur Verwendung von OpenSSL anstelle von Mcrypt-Verschlüsselung und -Entschlüsselung in PHP 7.1_php-Tipps

韦小宝
韦小宝Original
2017-12-04 13:29:421986Durchsuche

Als ich kürzlich PHP zur Entwicklung der WeChat-Funktion für öffentliche Konten verwendete, stellte ich fest, dass Mcrypt in PHP 7.1 veraltet ist. Ich hatte keine andere Wahl, als eine entsprechende zu finden Lösung, um es zu ersetzen. In diesem Artikel werden Ihnen hauptsächlich relevante Informationen zur Verwendung von OpenSSL anstelle der Mcrypt-Verschlüsselung und -Entschlüsselung in PHP 7.1 vorgestellt.

Zusammenfassung:

Nach der Veröffentlichung von php7.1 zogen die neuen Funktionen viele PHPer an und alle diskutieren darüber, was das ist Neue Funktionen bringen Vorteile und Annehmlichkeiten. Durch das Upgrade von php7.0 auf php7.1 wird jedoch eine in der Vergangenheit häufig verwendete Erweiterung (mcrypt-Erweiterung) veraltet (obsolete). Der Beamte gab entsprechende Lösungstipps, lieferte jedoch keine detaillierteren Lösungen. Hier kommt also die Falle:

Als ich heute die offene Plattform WeChat nutzte, um eine Verbindung zu einem Content-Management-System herzustellen, schlug die Bindung des offiziellen Kontos immer wieder fehl

Grund:

Während des Debuggens haben wir festgestellt, dass die direkte Ursache das in der offenen Plattform ausgefüllte Autorisierungsereignis ist (das Autorisierungsereignis sendet alle zehn Minuten ein Ereignis, um das Ticket zu aktualisieren). Das heißt:

Die hier ausgefüllte URL stellte fest, dass diese URL auch alle 10 Minuten korrekt war, das Ticket jedoch nicht empfangen wurde Bis zum Ende. Als ich mir den Code ansah, stellte ich fest, dass es an der Entschlüsselung lag. Als die Daten von WeChat kamen, wurde ein Fehler gemeldet:


<?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; 
 }


Das heißt, da meine Umgebung PHP 7.1 ist, muss ich nach Informationen suchen. Es wurde festgestellt, dass PHP 7.1 Mcrypt aufgegeben hat, sodass mcrypt_* in diesem Code nicht ausgeführt werden kann.

Lösung:

Bei der Suche nach Informationen wurde festgestellt, dass Mcrypt durch OpenSSL ersetzt werden kann (vorausgesetzt, die OpenSSL-Erweiterung wurde installiert). aber im Allgemeinen sind sie alle standardmäßig installiert)

openssl ist ein leistungsstarkes Toolkit, das viele kryptografische Algorithmen und praktische Tools integriert. Wir können das bereitgestellte Befehlskonsolentool verwenden, um Schlüssel und Zertifikate zum Ver- und Entschlüsseln von Dateien zu generieren, oder wir können die bereitgestellte API-Schnittstelle verwenden, um die übertragenen Informationen im Code zu verschlüsseln.

Der obige Code kann also geändert werden in:


<?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; 
 }


Ergänzung:

Die obige Entschlüsselung wurde geändert, sodass auch die entsprechende Mcrypt-Verschlüsselung geändert werden muss Unfähigkeit, das gesamte Netzwerk zu veröffentlichen und Nachrichten zu pushen. Der verschlüsselte Quellcode für Ereignisse wie
lautet wie folgt:


<?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; 
}


Der geänderte Code lautet:


<?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; 
}


Spezial Hinweis: Jeder Prozess, der WeChat-Entwicklung beinhaltet. Wenn Sie auf PHP 7.1 aktualisiert haben, müssen Sie prüfen, ob Mcrypt für die symmetrische Verschlüsselung und Entschlüsselung verwendet wird. Die in der WeChat-Entwicklungsdokumentation verwendete Demo verwendet Mcrypt auch für die Verschlüsselung und Entschlüsselung Dies muss beachtet werden.

Zusammenfassung

Das Obige ist der gesamte Inhalt dieses Artikels, der für alle in der WeChat-Entwicklung hilfreich sein wird Wenn Sie Fragen haben, wenden Sie sich bitte an uns. Stellen Sie Fragen im Community-Q&A auf dieser Website!

Verwandte Empfehlungen:

Ersatzschema für die AES-Verschlüsselungs- und -Entschlüsselungsmethode mcrypt_module_open() in PHP7. 1

Beispielcode für PHP Mcrypt-Verschlüsselung und -Entschlüsselung

PHP-Verschlüsselungs- und Entschlüsselungsmethode basierend auf OpenSSL

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung zur Verwendung von OpenSSL anstelle von Mcrypt-Verschlüsselung und -Entschlüsselung in PHP 7.1_php-Tipps. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn