Unterscheidet es sich also von der Hash-Verschlüsselung? Bei der Hash-Typ-Verschlüsselung handelt es sich um eine irreversible Einwegverschlüsselung. Der verschlüsselte Inhalt ist eine hexadezimale Hash-Zeichenfolge. Wir können den Klartextinhalt nur umkehren, solange wir einen Salt-Wert oder mehrere Sätze einer zweischichtigen Verschlüsselung hinzufügen. Es ist sehr schwierig, es zurückzuentwickeln. Daher wird normalerweise die Hash-Verschlüsselung zum Speichern von Benutzerkennwörtern verwendet. Auch wenn die Datenbank das Benutzerkennwort preisgibt, ist es dennoch sicher. OpenSSL, eine Art symmetrischer/asymmetrischer Verschlüsselung, kann über ein bestimmtes Schlüsselwort oder Zertifikat eine Vorwärtsverschlüsselung und eine Rückwärtsentschlüsselung durchführen. Der Originaltext
ist verfügbar. Lassen Sie uns nun ausführlich über symmetrische und asymmetrische Verschlüsselung sprechen.
Was sind symmetrische und asymmetrische Verschlüsselung?
Bei der symmetrischen Verschlüsselung wird normalerweise der Originaltext durch einen Schlüssel verschlüsselt. Mit anderen Worten: Wenn die beiden Enden kommunizieren, muss der verschlüsselte Inhalt, den sie übertragen, denselben Schlüssel für Verschlüsselungs-/Entschlüsselungsvorgänge verwenden, unabhängig davon, ob es sich um den Server, den Client oder einen anderen Peer handelt. Beide Seiten müssen gleichzeitig einen solchen Schlüssel speichern. Ich denke, jeder hat auch darüber nachgedacht, egal ob es sich um eine Webentwicklung oder eine App-Entwicklung handelt, der Code kann dekompiliert und der Quellcode angezeigt werden. Wenn eine symmetrische Verschlüsselung verwendet wird, kann der Schlüssel leicht erhalten werden. Der Vorteil der symmetrischen Verschlüsselung besteht jedoch darin, dass sie sehr schnell ist und keine Ressourcen verbraucht.
Asymmetrische Verschlüsselung enthält an beiden Enden unterschiedliche Schlüssel. Genau wie die gängigsten https-Zertifikate, die wir sehen, haben sie zwei Konzepte: öffentlichen Schlüssel und privaten Schlüssel. Im Allgemeinen verwenden wir den öffentlichen Schlüssel zur Verschlüsselung und dann den privaten Schlüssel zur Entschlüsselung. Normalerweise wird der öffentliche Schlüssel öffentlich gemacht und an die andere Partei gesendet, während der private Schlüssel hier aufbewahrt wird. Mit anderen Worten: Wenn die andere Partei uns Daten sendet, verwendet sie den öffentlichen Schlüssel, den wir ihr gegeben haben, um die Daten zu verschlüsseln. Die Daten sind während des Übertragungsprozesses sehr sicher, da niemand sonst über den privaten Schlüssel verfügt, um die Daten zu entschlüsseln, bis wir sie erhalten Wenn Sie die Daten erhalten, verwenden Sie Ihren eigenen privaten Schlüssel, um sie zu entschlüsseln und die Originaldaten zu erhalten. Da die Schlüsselinhalte auf beiden Seiten nicht gleich sind, ist die asymmetrische Verschlüsselung deutlich sicherer als die symmetrische Verschlüsselung. Obwohl der Algorithmus und die Komplexität der asymmetrischen Verschlüsselung um einige Stufen höher sind als die der symmetrischen Verschlüsselung, sind Geschwindigkeit und Leistung im Vergleich zu den Vorteilen der asymmetrischen Verschlüsselung zu Engpässen bei der asymmetrischen Verschlüsselung geworden, insbesondere wenn die Datenmenge groß ist. Darüber hinaus besteht das mathematische Prinzip der asymmetrischen Verschlüsselung darin, dass es schwierig ist, große Zahlen zu zerlegen. Das heißt, je größer die Zahl, desto schwieriger ist die Faktorisierung. Wenn ein Algorithmus dieses Problem in kurzer Zeit lösen kann, dann herzlichen Glückwunsch. Es ist die Grundlage moderner Verschlüsselungsalgorithmen. Die Obergrenze wurde von Ihnen durchbrochen.
Zu den häufig verwendeten Algorithmen für die symmetrische Verschlüsselung gehören: AES, DES, 3DES, IDEA, RC2, RC5 usw. Die am häufigsten verwendeten Algorithmen sind AES und DES.
Zu den häufig verwendeten Algorithmen für die asymmetrische Verschlüsselung gehören: RSA, Elgamal, ECC usw. RSA wird sehr häufig verwendet und ist weit verbreitet, und einige Zertifikatsalgorithmen basieren auf RSA.
Was sollten wir für die Systemsicherheit tun?
Gibt es also einen Kompromiss für uns, diese beiden Verschlüsselungsfunktionen zu nutzen? Natürlich gibt es sie, und es ist auch eine ganz klassische Technologie: digitale Briefumschläge.
Tatsächlich ist die Bedeutung sehr einfach: Die jeweiligen Vorteile dieser beiden Verschlüsselungsmethoden nutzen. Die asymmetrische Verschlüsselung bietet eine hohe Sicherheit, aber eine langsamere Geschwindigkeit. Je größer die Datenmenge, desto langsamer ist die Geschwindigkeit. Dann verwenden wir sie, um den Schlüssel der symmetrischen Verschlüsselung zu verschlüsseln. Dann verwendet die eigentliche Dateneinheit diesen symmetrisch verschlüsselten Schlüssel, um eine symmetrische Verschlüsselung durchzuführen und so die Geschwindigkeit zu verbessern. Wenn wir es an den Client senden, enthält es auf diese Weise zwei Inhalte: Der eine ist der durch asymmetrische Verschlüsselung verschlüsselte Schlüssel und der andere ist der durch symmetrische Verschlüsselung verschlüsselte Dateninhalt. Nachdem der Client die Informationen erhalten hat, verwendet er zunächst den asymmetrischen Verschlüsselungsschlüssel, um den symmetrischen Verschlüsselungsschlüssel zu entschlüsseln, und verwendet diesen Schlüssel dann, um den endgültigen Dateninhalt zu entschlüsseln. Sind Sie verwirrt? Schauen wir es uns anhand eines Bildes an, und vielleicht versteht es jeder auf einen Blick.
Unter diesen besteht keine Notwendigkeit, den öffentlichen Schlüssel und den privaten Schlüssel zu erklären. Der Sitzungsschlüssel ist der Schlüssel unseres symmetrischen Verschlüsselungsalgorithmus. In Kombination mit der obigen Erläuterung des digitalen Umschlagübertragungsprozesses sollte es jeder verstehen können.
OpenSSL Extended Symmetric Encryption
Okay, nachdem wir so viel theoretisches Wissen eingeführt haben, kehren wir zum Thema zurück. Wie implementieren wir symmetrische und asymmetrische Verschlüsselung in PHP? Es ist ganz einfach, verwenden Sie einfach die OpenSSL-Erweiterung. Diese Erweiterung wird auch mit dem PHP-Quellcode veröffentlicht. Fügen Sie beim Kompilieren und Installieren einfach --with-openssl hinzu. Natürlich ist auch die Installation der OpenSSL-Software in der Systemumgebung erforderlich. Diese ist grundsätzlich bereits in verschiedenen Betriebssystemen verfügbar. Wenn nicht, installieren Sie sie einfach selbst. Der einfachste Weg besteht darin, zu prüfen, ob in der Befehlszeile des Betriebssystems ein OpenSSL-Befehl vorhanden ist, um festzustellen, ob OpenSSL-bezogene Software auf dem aktuellen System installiert ist.
[root@localhost ~]# openssl version OpenSSL 1.1.1 FIPS 11 Sep 2018
Heute beschäftigen wir uns hauptsächlich mit relativ einfachen Funktionen im Zusammenhang mit der symmetrischen Verschlüsselung.
Symmetrische Verschlüsselungs-/Entschlüsselungsimplementierung
$data = '测试对称加密'; $key = '加密用的key'; $algorithm = 'DES-EDE-CFB'; $ivlen = openssl_cipher_iv_length($algorithm); $iv = openssl_random_pseudo_bytes($ivlen); $password = openssl_encrypt($data, $algorithm, $key, 0, $iv); echo $password, PHP_EOL; // 4PvOc75QkIJ184/RULdOTeO8 echo openssl_decrypt($password, $algorithm, $key, 0, $iv), PHP_EOL; // 测试对称加密 // Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended
openssl_encrypt() dient zur Verschlüsselung von Daten. Es sind drei Parameter erforderlich: Originaltext, Algorithmus und Schlüssel. Es wird jedoch empfohlen, den iv-Parameter (Vektor) selbst zu definieren Wenn also kein iv-Parameter vorhanden ist, wird eine Warnmeldung ausgegeben. Wir verwenden openssl_cipher_iv_length(), um die vom aktuellen Algorithmus benötigte iv-Länge abzurufen, und verwenden dann die Funktion openssl_random_pseudo_bytes(), um einen zufälligen iv-Inhalt zu generieren, der der Länge des Algorithmus entspricht.
Der Parameter 0 in der Mitte ist der bitweise ODER-Wert des angegebenen Tags. Er verfügt über zwei optionale Konstanten: OPENSSL_RAW_DATA und OPENSSL_ZERO_PADDING. Wenn er auf OPENSSL_RAW_DATA gesetzt ist, werden die verschlüsselten Daten unverändert zurückgegeben (binärer verstümmelter Inhalt). Wenn es auf OPENSSL_ZERO_PADDING gesetzt ist, werden die verschlüsselten Daten als Inhalt nach Base64 zurückgegeben.
openssl_decrypt() wird zum Entschlüsseln von Daten verwendet. Die erforderlichen Parameter sind grundsätzlich dieselben wie bei der Verschlüsselungsfunktion, außer dass die Originaldaten durch verschlüsselte Daten ersetzt werden.
Bei der symmetrischen Verschlüsselung gibt es auch einen AEAD-Verschlüsselungsmodus (GCM oder CCM). Bei Verwendung dieses Modusalgorithmus benötigen wir einen weiteren Parameter.
$algorithm = 'aes-128-gcm'; $password = openssl_encrypt($data, $algorithm, $key, 0, $iv, $tags); echo $password, PHP_EOL; // dPYsR+sdP56rQ99CNxciah+N echo openssl_decrypt($password, $algorithm, $key, 0, $iv, $tags), PHP_EOL; // 测试对称加密
Dieses $tags ist ein Referenztypparameter, das heißt, es wird dieser Variablen nach der Verschlüsselung zugewiesen. Das gleiche Verifizierungs-Tag ist auch während der Entschlüsselung erforderlich.
Aus Sicht des Ver- und Entschlüsselungsprozesses müssen wir, wenn wir diese Informationen in der Datenbank oder beim Übertragen und Entschlüsseln speichern möchten, zumindest diese Felder, das für die Verschlüsselung verwendete iv und den für die Verschlüsselung verwendeten Algorithmus speichern oder übertragen , und AEAD-Modus, das zur Verschlüsselung verwendete Verifizierungstag, andernfalls können die Daten nicht entschlüsselt werden.
Abfrage des symmetrischen Verschlüsselungsalgorithmus
print_r(openssl_get_cipher_methods()); // Array // ( // [0] => AES-128-CBC // [1] => AES-128-CBC-HMAC-SHA1 // [2] => AES-128-CFB // [3] => AES-128-CFB1 // [4] => AES-128-CFB8 // [5] => AES-128-CTR // [6] => AES-128-ECB // [7] => AES-128-OFB // [8] => AES-128-XTS // [9] => AES-192-CBC // [10] => AES-192-CFB // [11] => AES-192-CFB1 // [12] => AES-192-CFB8 // …… // )
Der im obigen Verschlüsselungs-/Entschlüsselungstest ausgewählte Algorithmus wird über diese Funktion gefunden. Diese Funktion zeigt eine Liste aller unterstützten Algorithmen in der aktuellen Umgebung an.
Zusammenfassung
Der Inhalt dieses Artikels enthält viel theoretisches Wissen, das jeder noch verdauen muss. Die Verwendung von OpenSSL zur Implementierung der Verschlüsselungs-/Entschlüsselungsfunktion ist eigentlich relativ einfach. Schließlich ist alles für uns gekapselt. Wir müssen die Funktion nur gemäß der Dokumentation aufrufen. Lernen erfordert immer noch die Kombination von Theorie und Praxis. Wichtiger ist natürlich, es selbst zu tun!
Testcode:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84OpenSSL%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86.php
Empfohlenes Lernen: php-Video-Tutorial