Heim  >  Artikel  >  Backend-Entwicklung  >  Wie PHP asymmetrische Verschlüsselung in der OpenSSL-Verschlüsselung verwendet

Wie PHP asymmetrische Verschlüsselung in der OpenSSL-Verschlüsselung verwendet

醉折花枝作酒筹
醉折花枝作酒筹Original
2021-06-02 17:50:282009Durchsuche

In diesem Artikel wird Ihnen die Methode der asymmetrischen Verschlüsselung in PHP mithilfe der OpenSSL-Verschlüsselung vorgestellt. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Wie PHP asymmetrische Verschlüsselung in der OpenSSL-Verschlüsselung verwendet

Im letzten Artikel haben wir einige relevante theoretische Kenntnisse über symmetrische und asymmetrische Verschlüsselung gelernt und auch gelernt, wie man OpenSSL zur Durchführung symmetrischer Verschlüsselungsvorgänge verwendet. Heute gehen wir noch einen Schritt weiter und erfahren, wie asymmetrische Verschlüsselung in OpenSSL implementiert wird.

Privaten Schlüssel generieren

Durch vorheriges Lernen wissen wir, dass für die asymmetrische Verschlüsselung jeweils ein öffentlicher Schlüssel und ein privater Schlüssel erforderlich sind. Lassen Sie uns zunächst einen privaten Schlüssel generieren, bei dem es sich um einen auf unserer Seite gespeicherten Schlüssel handelt. Bitte denken Sie daran, dass der private Schlüssel zu keinem Zeitpunkt an andere weitergegeben werden kann!

$config = array(
    "private_key_bits" => 4096, // 指定应该使用多少位来生成私钥
);

$res = openssl_pkey_new($config); // 根据配置信息生成私钥

openssl_pkey_export($res, $privateKey); // 将一个密钥的可输出表示转换为字符串
var_dump($privateKey); 
// -----BEGIN PRIVATE KEY-----
// MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDFMLW+9t3fNX4C
// YBuV0ILSyPAdSYVXtE4CLv32OvNk9yQZgF2nL/ZuIbBGRcYo2Hf5B31doGrAFDGu
// NoTR+WA7CBjKROFr/+yValsMFIeiKNtttWMkmBciysDJoEoyd6wjDD+kcHQdoJVo
// ……
// -----END PRIVATE KEY-----

Eine sehr einfache Funktion öffnet sl_pkey_new(), die einen Parameter empfängt, der ein konfigurierbarer und optionaler Parameter ist. Das generierte Ergebnis ist ein privates Schlüsselhandle, das wir nicht direkt lesen können. Daher verwenden wir openssl_pkey_export(), um die Ausgabezeichenfolge zu extrahieren.

Der Inhalt in den Kommentaren sind die von uns generierten privaten Schlüsselinformationen. Die privaten Schlüsselinformationen sind im Allgemeinen relativ umfangreich, daher wird der folgende Inhalt weggelassen.

Extrahieren Sie den öffentlichen Schlüssel

Der nächste Schritt besteht darin, den öffentlichen Schlüssel zu generieren. Tatsächlich wird der öffentliche Schlüssel aus dem privaten Schlüssel extrahiert. Wenn wir also Verschlüsselung und Entschlüsselung verwenden, können wir private Schlüssel oder öffentliche Schlüssel verwenden, um miteinander zu arbeiten.

$publicKey = openssl_pkey_get_details($res); // 抽取公钥信息
var_dump($publicKey);
// array(4) {
//     ["bits"]=>
//     int(4096)
//     ["key"]=>
//     string(800) "-----BEGIN PUBLIC KEY-----
//   MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtOIImDdS0W0vAr5Ra1+E
//   hR2AJwQQwxntYKgTku8EmJRBX2vU+x8th8W8SnoGiVM/sOItG0HIe4Egf1UxoZHt
//   gI6r+jpAp7JbTN0sD/VTPDE09F21+hFGjIVBqrkcLPjuEbf7+tjmgAx8cG8WLGId
//   G8Hsub70kRANKJe1bCXIBUggRFk0sQGllxA/hxiG5wANqHTrdpJgJba+ahSi2+4H
//   UWnyCV1O3AaPyz6a12HNUsG4Eio/tWv/hOB9POt6nAqwPHuIbhp56i5bv1ijMJZM
//   jwRen5f/kwdZ01Ig2fi0uBoTR2y/EEaus7xBYpF/gGzZ/uM7cNUXcDyG5YluM/4R
//   MEv4msPMVGB72izItED+C6Cqftxl98iBFRDc+PISFbRSgOU/HsuBhKkM5SYzyi3I
//   Ypaej25++qLPqcA+EDr3JNDhNZ0GOhofCRtPq4dsr7iLLLRnZ0TnhIYe9wAbmO49
//   uthABNBkM54bG+omOfY4Bkn5n39CKpELbhIiXgOd+lA684XUS/2Aw3Dvelc9Gbag
//   oIFvb/wljPYsd0Zmd64CXBpTWbfwXC8K4vCKvFLjytcz2Yp4T6fVjbLT5RA6u8su
//   E0WwE4QTFNKhnM5OvfiMN+NMc3Y/esVfcin3eyvotdz4N6Tt45dkybkf6aQE3Scg
//   E/JBLIEEA+gjGTveY4cNUiECAwEAAQ==
//   -----END PUBLIC KEY-----
//   "
//     ["rsa"]=>
// ……

$publicKey = $publicKey['key'];

Der mit openssl_pkey_get_details() extrahierte Inhalt enthält viel Inhalt. Aber das Wichtigste, was wir brauchen, ist der öffentliche Schlüssel unter dem Schlüssel.

Gehen wir noch einmal zurück und schauen wir uns den Inhalt des öffentlichen und des privaten Schlüssels genauer an. Sind sie identisch mit dem Inhalt des öffentlichen und des privaten Schlüssels im HTTPS-Zertifikat, das wir beantragt haben, und werden sie auch von uns generiert? die OpenSSL-Befehlszeile im System? Das Schlüsselzertifikat dieser Maschine ist dasselbe. Sie sind an sich dasselbe, werden jedoch in verschiedenen Szenarien unterschiedlich angewendet. Zusätzlich zum asymmetrischen Verschlüsselungsschlüssel enthält das HTTPS-Zertifikat auch CA-Informationen. Wenn die CA nicht besteht, betrachtet der Browser das Zertifikat ebenfalls als ungültig. Daher können wir das von uns generierte Zertifikat nicht als HTTPS-Zertifikat verwenden. Die von ihnen selbst generierten werden im Allgemeinen für die passwortfreie SSH-Anmeldung oder den passwortfreien GitHub-Code-Warehouse-Betrieb verwendet.

Daten verschlüsseln und entschlüsseln

Okay, der öffentliche Schlüssel und der private Schlüssel wurden generiert, dann müssen wir die wichtigsten Ver- und Entschlüsselungsvorgänge durchführen.

$data = '测试非对称加密';

// 公钥加密数据
openssl_public_encrypt($data, $encrypted, $publicKey);
var_dump($encrypted);
// string(512) 

// 私钥解密数据
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
var_dump($decrypted);
// string(21) "测试非对称加密"

Hier verwenden wir zum Testen die gängigste Verschlüsselung mit öffentlichem Schlüssel und die Entschlüsselung mit privatem Schlüssel. Tatsächlich ist auch das Gegenteil möglich. OpenSSL bietet uns Funktionen zur Verschlüsselung und Entschlüsselung mit öffentlichen Schlüsseln und zur Verschlüsselung und Entschlüsselung mit privaten Schlüsseln.

Genau wie in der Abbildung im vorherigen Artikel erhält die andere Partei unseren öffentlichen Schlüssel, verschlüsselt dann die Daten und überträgt sie, und wir entschlüsseln die Daten mit unserem eigenen privaten Schlüssel, um den Originaltext zu erhalten. Wir können auch den öffentlichen Schlüssel der anderen Partei erhalten, die zurückgegebenen Daten verschlüsseln und an die andere Partei übertragen. Anschließend verwendet die andere Partei ihren eigenen privaten Schlüssel, um die Originaldaten, die wir an sie übergeben haben, zu entschlüsseln und abzurufen.

Und HTTPS erhält den öffentlichen Schlüssel über das von der Zertifizierungsstelle ausgestellte Zertifikat. Der Browser verschlüsselt die Anforderungsdaten und überträgt sie über den öffentlichen Schlüssel an den Server. Der Server verwendet das gleiche Prinzip, um Chiffretextdaten an den Browser-Client zu senden. Daher ist die Übertragung über HTTPS während der Datenübertragung sicherer. Selbst wenn sie abgefangen wird, verfügt die andere Partei nicht über den vom Zertifikat bereitgestellten Schlüssel, um sie zu entschlüsseln. Aus diesem Grund erfordern alle Apps und Miniprogrammanwendungen jetzt die Verwendung von HTTPS. Wenn wir Websites entwickeln, ist es natürlich am besten, HTTPS zu verwenden. Auch Baidu hat entsprechende Anpassungen an der Einbindung von HTTPS vorgenommen.

Signatur und Verifizierung

Als nächstes werden wir auf das Konzept der Signatur eingehen. Wenn zwei Enden kommunizieren, woher wissen wir, dass die aktuell übertragenen Daten vom anderen Ende gesendet wurden? Hat irgendein Hacker sie manipuliert? Dies kann durch den Signaturmechanismus überprüft werden.

// 利用私钥生成签名
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
var_dump($signature);

// 公钥验证签名
$r = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
var_dump($r);
// int(1)

Wir verwenden openssl_sign(), um eine private Schlüsselsignatur für die Originaldaten zu generieren, und können dann openssl_verify() verwenden, um zu überprüfen, ob die Datensignatur über den öffentlichen Schlüssel konsistent ist.

Bei Verwendung generiert der Absender eine Signatur über seinen eigenen privaten Schlüssel. Da der Signaturinhalt verstümmelt ist, können wir ihn mit base64_encode() und dann zusammen mit den verschlüsselten Daten an den Empfänger weitergeben. Der Empfänger verwendet dann den öffentlichen Schlüssel und überprüft anhand des Signaturinhalts, ob die Originaldaten manipuliert wurden.

// 发送方签名
$resquestSign = base64_encode($signature);

// 假设通过网络请求发送了数据
// ……
// 接收到获得签名及原始数据
// $signature = $_POST['sign'];
// openssl_private_decrypt($_POST['data'], $data, $privateKey); 

$responseSign = base64_decode($signature);
// 验证数据有没有被篡改
$r = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
var_dump($r);
// int(1)

// 假设被篡改
$data = '我被修改了';
$r = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
var_dump($r);
// int(0)

Zusammenfassung

Glauben Sie, dass der heutige Inhalt viel komplizierter ist als die symmetrische Verschlüsselung? Insbesondere das neu eingeführte Konzept der Signatur. Tatsächlich beziehen sich viele zertifikatbezogene Inhalte auf die Datensignatur. Mit anderen Worten, HTTPS scheint eine einfache Lösung zu sein. Tatsächlich hat OpenSSL auf dem Browser und dem Server viel mehr getan, als nur bei der Zertifizierungsstelle eine Reihe von Zertifikaten zu beantragen und dann zu konfigurieren sie in Nginx. Als nächstes lernen wir die Inhalte im Zusammenhang mit der Erstellung von Zertifikaten. Schnallen Sie sich an und das Auto fährt weiter.

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%BA%8C%EF%BC%89%EF%BC%9A%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86.php

推荐学习:php视频教程

Das obige ist der detaillierte Inhalt vonWie PHP asymmetrische Verschlüsselung in der OpenSSL-Verschlüsselung verwendet. 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