Heim  >  Artikel  >  Backend-Entwicklung  >  Beispielerklärung für PHP 7.1 mit OpenSSL anstelle der Mcrypt-Verschlüsselung und -Entschlüsselung

Beispielerklärung für PHP 7.1 mit OpenSSL anstelle der Mcrypt-Verschlüsselung und -Entschlüsselung

*文
*文Original
2017-12-25 10:19:541247Durchsuche

Mcrypt wird möglicherweise häufig von einigen WeChat-Entwicklern verwendet, aber Mcrypt ist in PHP 7.1 veraltet. Gibt es noch andere Alternativen? Dieser Artikel stellt Ihnen die relevanten Informationen zur Verwendung von OpenSSL anstelle der Mcrypt-Verschlüsselung und -Entschlüsselung in PHP 7.1 vor. Ich hoffe, dass er für Sie hilfreich ist.

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 eingegebene URL. Nach dem Debuggen wurde festgestellt, dass diese URL auch alle 10 Minuten korrekt ist, das Ticket wurde jedoch nicht empfangen 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.

Verwandte Empfehlungen:

PHP WeChat-Schnittstellenkapselungsklasse_PHP-Tutorial

PHP WeChat-Entwicklungsplattform, kleines Experiment zur Entwicklung

PHP WeChat-Zahlungsklasse demo_php-Instanz

Das obige ist der detaillierte Inhalt vonBeispielerklärung für PHP 7.1 mit OpenSSL anstelle der Mcrypt-Verschlüsselung und -Entschlüsselung. 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