Wie implementiert Node die Verschlüsselung und Entschlüsselung der Datenübertragung? Der folgende Artikel stellt Ihnen vor, wie Node.js die Verschlüsselung und Entschlüsselung der Front-End- und Back-End-Datenübertragung implementiert. Ich hoffe, er ist hilfreich für Sie!
Node.js-Schnelleinführungskurs: Geben Sie ein, um zu lernen
Während des Front-End- und Back-End-Kommunikationsprozesses müssen einige vertrauliche Informationen, insbesondere das Konto und das Passwort des Benutzers, für die Übertragung verschlüsselt werden. Die Auswahl der Verschlüsselungsmethode ist ebenfalls eine Wissenschaft, aber es besteht keine Notwendigkeit, zu weit zu gehen Hier. Im Allgemeinen ist die am häufigsten verwendete Übertragungsdatenverschlüsselung in der B/S-Architektur die RSA-Verschlüsselung. Die Kernidee ist die Verschlüsselung mit öffentlichem Schlüssel und die Entschlüsselung mit privatem Schlüssel . Der öffentliche Schlüssel kann als Schlüssel verstanden werden, der öffentlich gemacht werden kann. Der Client verwendet den öffentlichen Schlüssel, um die Daten zu verschlüsseln und zu übertragen. Der Server empfängt den Chiffretext vom Client Entschlüsseln Sie Ihren eigenen gepaarten privaten Schlüssel, um die Originaldaten zu erhalten.
Der allgemeine Prozess ist in der folgenden Abbildung dargestellt:
In Nodejs gibt es ein Kernmodul – crypto
, das verschiedene APIs für die Verschlüsselung und Entschlüsselung bereitstellt. Die folgenden Beispiele basieren auf der [email protected]
.
const crypto = require('crypto'); /** * Generieren Sie öffentliche und private RSA-Schlüsselpaare * @return {*} publicKey: public key: private key; Funktion genRSAKeyPaire() { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { Modullänge: 4096, publicKeyEncoding: { Typ: 'pkcs1', Format: 'pem', }, privateKeyEncoding: { Typ: 'pkcs1', Format: 'pem', }, }); return { publicKey, privateKey }; } //Drucken Sie die generierten öffentlichen und privaten Schlüsselpaare console.log(genRSAKeyPaire());
Die Beispielausgabe lautet wie folgt:
(Ein Teil der öffentlichen und privaten Beispielschlüssel wurde gelöscht. Bitte verwenden Sie ihn nicht für Experimente.)
{ publicKey: '-----BEGIN RSA PUBLIC KEY-----n' + 'MIICCgKCAgEAsitohTu9Jf2h+NPV4tNfFhPrlbStzXNM8wSEcskwtpwi6aZfgQC7n' + '/A7M1hN8Zk8WgiZjy05AHinWPvXo70OWj8TminIAjB2wh0nDqm+IQqN7r20uzeJmn' + 'GBf1KusGemChEiFwiad1h/OB9z9LC8zMYR/G+XAbFfcv8MxAMI9mgmS8t5+xeYm6n' + 'EMiCQkQjfqpErhW3oESj8hrdJdOZbiK3l0TgYLyjZRQu6pHzFkmd9We3BY1qcXo1n' + '2BtNKvqoH9QDJItsb3S9v2mOGl1rbItKlDrqYCdGY4iyXVIfagNWHraVzHqH/tern' + 'X+hOmLOwu+Npkz+oEDmnUq1UGY181PBGiNwHVodXx+DF5ckj/bGIxFG2nSiNe3dOn' + 'WLxV3+W8Af0006Oe+fRo1D7xt5SK5AipCpylKKYdyuP3MJ5dpPu7GMIcwj20Ndnun' + 'cDJJ2HH9kZAKz6/r62S7ALluFSecuZr0Dqc6SrJs43zBTpS/hSI33r01ste6Zel8n' + 'uRZKW/4FhUg8gW1KCM+Mp1MaZufOurCDc1Iec0SI71Tteg52BTpfb8cQ9Z1h0xWRn' + 'FdbmLMLuJkIi5oG2+FLAqlGknik0AxXpnlivSOW5Q+eLOh0DjQxxU2sCAwEAAQ==n' + '-----END RSA PUBLIC KEY-----n', privateKey: '-----BEGIN RSA PRIVATE KEY-----n' + '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' + '-----END RSA PRIVATE KEY-----n' }
2. Verschlüsselung mit öffentlichem Schlüssel
Basierend auf dem öffentlichen und privaten Schlüsselpaar wird der öffentliche Schlüssel zur Verschlüsselung verwendet. Der Beispielcode lautet wie folgt:
const crypto = require('crypto'); /** * Erzeuge ein Paar aus öffentlichem und privatem Schlüssel * @return {*} publicKey: public key; Funktion genRSAKeyPaire() { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { Modullänge: 4096, publicKeyEncoding: { Typ: 'pkcs1', Format: 'pem', }, privateKeyEncoding: { Typ: 'pkcs1', Format: 'pem', }, }); return { publicKey, privateKey }; } const { publicKey } = genRSAKeyPaire(); /** * Öffentlichen Schlüssel zur Verschlüsselung verwenden * @param {String} Daten * @param {String} publicKey * @return {String} verschlüsselter Chiffretext */ Funktion publicKeyEncrypt(data, publicKey) { return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } const-Eintrag = { Name: 'zhangsan', Passwort: '123456' }; // Konvertieren Sie die Daten in das String-Format, führen Sie eine Public-Key-Verschlüsselung durch und drucken Sie console.log(publicKeyEncrypt(JSON.stringify(entry), publicKey));
Der Ausgabeinhalt hat das folgende Format:
(Daten wurden gelöscht)
Ri0p8QFmnYe8Xo36DextK242o9pcdL0QFDo6gUxhzjwQD30UFlqJL57na445BebSp1VT1z94emJgrME7xTDzV1tshtmVNtarqCUCzZMF4uYAtZCQLJhCX3708g7lOFksiUvi6MlXCVVOIu2Vy FsIS /TW 8 xd4=
3. Entschlüsselung des privaten Schlüssels
Nachdem der Chiffretext mit dem öffentlichen Schlüssel verschlüsselt wurde, entschlüsseln Sie ihn mit dem privaten Schlüssel. Der Code lautet wie folgt:
const crypto = require('crypto'); /** * Erzeuge ein Paar aus öffentlichem und privatem Schlüssel * @return {*} publicKey: public key; Funktion genRSAKeyPaire() { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { Modullänge: 4096, publicKeyEncoding: { Typ: 'pkcs1', Format: 'pem', }, privateKeyEncoding: { Typ: 'pkcs1', Format: 'pem', }, }); return { publicKey, privateKey }; } const { publicKey, privateKey } = genRSAKeyPaire(); /** * Öffentlichen Schlüssel zur Verschlüsselung verwenden * @param {String} Daten * @param {String} publicKey * @return {String} verschlüsselter Chiffretext */ Funktion publicKeyEncrypt(data, publicKey) { return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } const-Eintrag = { Name: 'zhangsan', Passwort: '123456' }; const verschlüsseltData = publicKeyEncrypt(JSON.stringify(entry), publicKey); /** * Mit privatem Schlüssel entschlüsseln * @param {String} verschlüsselte Daten * @param {String} privateKey * @return {String} entschlüsselter Klartext */ Funktion privateKeyDecrypt(encryptedData, privateKey) { return crypto.privateDecrypt(privateKey, Buffer.from(encryptedData, 'base64')).toString(); } const originData = privateKeyDecrypt(encryptedData, privateKey); //Drucken Sie die mit dem privaten Schlüssel entschlüsselten Daten console.log(originData);
Ausgabeergebnis:
{"name": "zhangsan", "password": "123456"}
Der Inhalt entry
ist konsistent, was darauf hinweist, dass die Entschlüsselung erfolgreich war, aber die Entschlüsselung ist eine Zeichenfolge. Wenn die Originaldaten ein Objekt sind, vergessen Sie nicht, sie in ein Objekt zu deserialisieren.
In der täglichen Entwicklung wird bei der Front-End- und Back-End-Kommunikation, insbesondere bei wichtigen Informationen, im Allgemeinen eine Verschlüsselung der Kommunikationsübertragung durchgeführt, um zu verhindern, dass Dritte diese erhalten und verwenden. Die einfachste Methode ist die Verwendung des https
-Protokolls , aber das https-Protokoll allein reicht nicht aus (es kann leicht von einem Man-in-the-Middle gekapert und angegriffen werden). Daher müssen die Daten auf der Anwendungsebene verschlüsselt werden, um zu verhindern, dass die Daten von anderen entführt und verwendet werden. Durch die Verwendung der asymmetrischen Verschlüsselung kann sichergestellt werden, dass der gesendete Chiffretext nur vom Server mit dem privaten Schlüssel entschlüsselt werden kann, wodurch verhindert wird, dass der Chiffretext entschlüsselt wird entschlüsselt und von anderen unabhängigen Parteien verwendet. Es gibt keine absolute Sicherheit im Internetbereich. Die einzige langfristige Lösung besteht darin, Ihr Sicherheitsbewusstsein kontinuierlich zu verbessern und Ihre Sicherheitskompetenzen zu verbessern.