Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Verwendung von OpenSSL als Ersatz für Mcrypt in PHP7.1

Einführung in die Verwendung von OpenSSL als Ersatz für Mcrypt in PHP7.1

不言
不言Original
2018-07-03 15:23:521778Durchsuche

In diesem Artikel wird hauptsächlich das detaillierte Beispiel für die Verwendung von OpenSSL als Ersatz für mcrypt in PHP7.1 vorgestellt. Freunde, die es benötigen, können darauf verweisen.

Verwenden Sie mcrypt in der Entwicklung Funktionen AES-Verschlüsselungs- und -Entschlüsselungsvorgänge können problemlos durchgeführt werden, aber die mcrypt-Erweiterung wird in PHP7.1 aufgegeben, sodass eine andere Implementierung gefunden werden muss. Das Ersetzen von mcrypt durch openssl wird bereits im Migrationshandbuch erwähnt, es wird jedoch kein konkretes Beispiel gegeben. Es gibt online viele Beispiele, die die meisten Szenarien ersetzen können, aber die Details werden nicht erklärt. Ebenso kann die einfache Verwendung von Online-Beispielen in bestimmten Codeszenarien zu Kompatibilitätsproblemen vor und nach dem Ersetzen des Codes führen. Lassen Sie uns weiter unten über die spezifischen Codes und Gründe sprechen.

Zuerst geben wir den Ersatzcode direkt an und analysieren dann das Problem anhand des Codes. (Der in diesem Artikel analysierte Algorithmus ist AES-128-CBC)

Ersatzbeispiel

Das Beispiel zeigt zwei Möglichkeiten der Verwendung von mcrypt: Der Unterschied liegt hauptsächlich in der Polsterung (die Polsterung wird weiter unten erläutert). Während des gesamten Verschlüsselungs- und Entschlüsselungsprozesses implementiert ein vollständigerer Code das Füllen und Entfernen des Füllens automatisch, und ein einfacherer Code ignoriert das Füllen direkt, aber beide Methoden können in der tatsächlichen Entwicklung normal ausgeführt werden (Versionen vor 7.1). Es wird empfohlen um Polsterung hinzuzufügen. Bitte sehen Sie sich das folgende konkrete Beispiel an:

mcrypt verwendet kein Padding

mcrypt-Verschlüsselung:

 $key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
 $iv = 'aaaaaaaaaaaaaaaa';
 $data = 'dataString';
 $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
 mcrypt_generic_init($cipher, $key, $iv);
 $cipherText256 = mcrypt_generic($cipher, $data);
 mcrypt_generic_deinit($cipher);
 return bin2hex($cipherText256);

OpenSSL-Verschlüsselungscode mit der gleichen Funktion:

 $key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
 $iv = 'aaaaaaaaaaaaaaaa';
 $data = 'dataString';

 $data = $data . str_repeat("\x00", 16 - (strlen($data) % 16)); // 双引号可以解析asc-ii码\x00
 return bin2hex(openssl_encrypt($data, "AES-256-CBC", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv));

mcrypt verwendet Padding

mcrypt-Verschlüsselung:

$key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
 $iv = 'aaaaaaaaaaaaaaaa';
 $data = 'dataString';
 // 填充(移除填充反着移除即可)
 $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
 $pad = $block - (strlen($data) % $block);
 if ($pad <= $block) {
 $char = chr($pad);
 $data .= str_repeat($char, $pad);
 }
 $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;);
 mcrypt_generic_init($cipher, $key, $iv);
 $cipherText256 = mcrypt_generic($cipher, $data);
 mcrypt_generic_deinit($cipher);
 return bin2hex($cipherText256);

OpenSSL-Verschlüsselungscode mit der gleichen Funktion:

 $key = &#39;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#39;; 
 $iv = &#39;aaaaaaaaaaaaaaaa&#39;;
 $data = &#39;dataString&#39;;  
return bin2hex(openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv));

Die obigen Beispiele laufen alle erfolgreich, wobei das erste Beispiel (ohne Auffüllung, aber Auffüllung in OpenSSL) und das zweite Beispiel (mit Auffüllung, ohne Auffüllung in OpenSSL) vor und nach dem Ersetzen die gleiche Ausgabe haben, und Keine Kompatibilitätsprobleme. Sie können basierend auf den unterschiedlichen Füllmethoden des Codes unterschiedliche Ersatzlösungen auswählen, es gibt jedoch drei Details, die erklärt werden müssen

Warum gibt es eine Auffüllung?

Warum unterscheiden sich die Namen der Algorithmen, nachdem sie durch openssl ersetzt wurden?
Im nächsten Kapitel werden die Füllung und der Algorithmus im Detail analysiert.

Padding

Warum es Padding gibt, beginnt mit dem Verschlüsselungsalgorithmus. Denn im AES-128-CBC-Algorithmus wird die zu verschlüsselnde Zeichenfolge alle 16 Bytes in Segmente segmentiert und Schritt für Schritt berechnet, was dazu führt, dass Segmente mit weniger als 16 Bytes gefüllt werden. Daher gibt es zwei Arten von Beispielen: Zum einen wird die Standardfüllung verwendet, zum anderen wird die unabhängige Füllung verwendet. Beim Ersetzen von OpenSSL erfordert die Auswahl des Auffüllschemas Kenntnisse über die standardmäßige und autonome Auffüllung von mcrypt und OpenSSL.

mcrypt-Standardauffüllung

Im Quellcode von PHP ist zu erkennen, dass die Standardauffüllung x00 ist Es kann festgestellt werden, dass zunächst eine 16-Bit-Leerzeichenfolge angewendet wird, sodass jedes Byte während der Initialisierung x00 ist. Tatsächlich kann man sagen, dass es keine Auffüllung gibt, sondern die verschlüsselte Zeichenfolge Die Verwendung der Standardauffüllung erfolgt in der folgenden Form:

mcrypt wird standardmäßig mit

aufgefüllt, also das Extra x00 muss beim Entschlüsseln entfernt werden. Natürlich können Sie auch faul sein und x00 nicht entfernen. Da die Zeichenfolge „stringx00“ und die Zeichenfolge „string“ in PHP bis auf die Länge die gleiche Leistung haben, scheint es keinen Unterschied zu geben. Der folgende Code:

 // 尾部包含若干个`\x00` 均可功输出true
 if ("string\x00" == "string") { // 用双引号可解析\x00
 echo true;
 }

Beispiel nach x00-Auffüllung: (Bitte achten Sie auf die Länge der Zeichenfolge, es ist ersichtlich, dass sich die Auffüllung mit x00 auf die Länge auswirkt)

mcrypt autonomes Auffüllen

Der Füllalgorithmus muss gemäß dem folgenden Algorithmus ausgeführt werden:

Füllung hinzufügen

/**
 * 填充算法
 * @param string $source
 * @return string
 */
 function addPKCS7Padding($source)
 {
 $source = trim($source);
 $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

 $pad = $block - (strlen($source) % $block);
 if ($pad <= $block) {
  $char = chr($pad);
  $source .= str_repeat($char, $pad);
 }
 return $source;
 }

Nach dem Hinzufügen der Polsterung sieht die Zeichenfolge tatsächlich so aus:

Mit entfernter Polsterung

 /**
 * 移去填充算法
 * @param string $source
 * @return string
 */
 function stripPKSC7Padding($source)
 {
 $source = trim($source);
 $char = substr($source, -1);
 $num = ord($char);
 if ($num == 62) return $source;
 $source = substr($source, 0, -$num);
 return $source;
 }

OpenSSL-Standardauffüllung

Die Standardmethode stimmt mit der standardmäßigen unabhängigen Auffüllungsmethode von mcrypt überein, also im zweiten Beispiel, nachdem der obige Auffüllungsalgorithmus verwendet wurde kann direkt durch openssl_encrypt ersetzt werden, es treten keine Kompatibilitätsprobleme auf. Die aufgefüllte verschlüsselte Zeichenfolge hat die folgende Form:

Es ist zu beachten, dass Padding und Padding-Entfernung in openssl_encrypt und openssl_decrypt integriert sind, sodass Sie es direkt verwenden können, sofern nicht Sie müssen es selbst tun. Implementieren Sie das Auffüllen, andernfalls müssen Sie kein Auffüllen in Betracht ziehen Auffüllen, aber nach Überprüfung des PHP-Quellcodes von openssl Der Testfallcode hat die korrekte Verwendung gefunden:

 // if we want to manage our own padding
 $padded_data = $data . str_repeat(&#39; &#39;, 16 - (strlen($data) % 16));
 $encrypted = openssl_encrypt($padded_data, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
 $output = openssl_decrypt($encrypted, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
 var_dump(rtrim($output));
(备注:如上,OPENSSL_ZERO_PADDING 并非是为0填充的意思)

Damit können wir erklären, warum im ersten Beispiel der Code für die unabhängige Punktladung x00 vor openssl_encrypt hinzugefügt wurde.

Von der obigen Verschlüsselung und Entschlüsselung unterscheidet sich die Fülllogik gut :

Beispiel 1:

mcrypt verwendet beim Verschlüsseln kein Auffüllen, daher wird es mit x00 aufgefüllt. Wenn Sie es also durch OpenSSL ersetzen, müssen Sie das x00-Auffüllen unabhängig implementieren.

Beispiel 2:

mcrypt verwendet beim Verschlüsseln Standard-Padding, und die Padding-Methode von OpenSSL ist ebenfalls Standard-Padding, sodass Sie sie direkt verwenden können.

Nachdem wir dies analysiert haben, können wir feststellen, dass wir unabhängig von der Auffüllstrategie darauf achten müssen, während der Verschlüsselung Auffüllungen hinzuzufügen und während der Entschlüsselung Auffüllungen zu entfernen. An diesem Punkt ist die Füllanalyse im obigen Beispiel abgeschlossen. Schauen wir uns als Nächstes an, wie der ersetzte Algorithmus ausgewählt wird.

Algorithmus auswählen

Im obigen Beispiel gibt es ein Problem mit dem AES-128-CBC-Algorithmus in mcrypt, in openssl How to Durch AES_256 ersetzen?
Zu diesem Punkt habe ich keine vernünftige Erklärung gefunden. Ich habe eine Weile den Quellcode überprüft und konnte den Grund nicht finden (die Fähigkeit ist begrenzt ~), aber durch die folgenden Informationen wurde das Funktion ist noch abgeschlossen

Openssl entschlüsselt mcrypt AES-Dateninkompatibilitätsproblem

Konvertieren Sie mcrypt_generic in openssl_encrypt. Stellen Sie eine Frage

Wenn Schüler den Grund finden, gehen Sie bitte mir eine Nachricht, danke.

Zusammenfassung

Wenn beim Verschlüsselungsteil mit mcrypt AES ein Problem während des Austauschvorgangs auftritt, können Sie diese ersetzen oder ausfüllen Zwei aus dem Algorithmus. Fangen wir an, darüber nachzudenken. Gleichzeitig ist eine der Bedingungen, die erfüllt sein müssen, die Auswahl verschiedener Füllmethoden. Beim Austausch ist es am wichtigsten, sicherzustellen, dass nach dem Austausch keine Änderungen auftreten. Obwohl es nur einen geringfügigen Unterschied gibt – den Unterschied in den letzten paar Zeichenfolgen – ist es mühsam, ihn auf mehreren Plattformen gleichzeitig zu ändern, aber je weniger Änderungen, desto geringer das Risiko.

In diesem Artikel wird der AES-Algorithmus nur kurz erläutert. Ob andere Algorithmen anwendbar sind, muss noch untersucht werden.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

PHP-Implementierung zum Speichern von Canvas-Bildern in HTML5 auf dem Server

PHP-Schnittstelle mit Mehrfachvererbung und Tarits Implementierungsmethoden für Mehrfachvererbungseffekte_php-Fähigkeiten

Beispielanalyse der Funktion zum Hochladen mehrerer Bilder, implementiert durch das Laravel-Framework + Blob

Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung von OpenSSL als Ersatz für Mcrypt in PHP7.1. 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