Heim >Web-Frontend >js-Tutorial >Lassen Sie uns darüber sprechen, wie Node die Verschlüsselung und Entschlüsselung der Front-End- und Back-End-Datenübertragung implementiert.

Lassen Sie uns darüber sprechen, wie Node die Verschlüsselung und Entschlüsselung der Front-End- und Back-End-Datenübertragung implementiert.

青灯夜游
青灯夜游nach vorne
2022-08-22 19:34:143020Durchsuche

KnotenWie implementiert man 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!

Lassen Sie uns darüber sprechen, wie Node die Verschlüsselung und Entschlüsselung der Front-End- und Back-End-Datenübertragung implementiert.

Während des Front-End- und Back-End-Kommunikationsprozesses müssen einige vertrauliche Informationen, insbesondere das Kontokennwort des Benutzers, für die Übertragung verschlüsselt werden. Die Auswahl der Verschlüsselungsmethode ist ebenfalls eine Wissenschaft, aber ich werde es nicht tun gehe hier zu weit. Im Allgemeinen ist die am häufigsten verwendete Übertragungsdatenverschlüsselung in der B/S-Architektur die RSA-Verschlüsselung. Die Kernidee ist „Verschlüsselung mit öffentlichem Schlüssel und 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:

Lassen Sie uns darüber sprechen, wie Node die Verschlüsselung und Entschlüsselung der Front-End- und Back-End-Datenübertragung implementiert.

Example

1. code>cryptoStellen Sie verschiedene APIs für die Verschlüsselung und Entschlüsselung bereit. Die folgenden Beispiele basieren auf der Version Node@12.15.0.
const crypto = require('crypto');

/**
 * 生成RSA公私钥对
 * @return {*} publicKey: 公钥;privateKey: 私钥
 */
function genRSAKeyPaire() {
  const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
    modulusLength: 4096,
    publicKeyEncoding: {
      type: 'pkcs1',
      format: 'pem',
    },
    privateKeyEncoding: {
      type: 'pkcs1',
      format: 'pem',
    },
  });
  return { publicKey, privateKey };
}

// 打印生成的公私钥对
console.log(genRSAKeyPaire());
Das Ausgabebeispiel lautet wie folgt:
(Ein Teil der öffentlichen und privaten Schlüssel im Beispiel wurde gelöscht, bitte nicht für Experimente verwenden)

{
  publicKey: '-----BEGIN RSA PUBLIC KEY-----\n' +
    'MIICCgKCAgEAsitohTu9Jf2h+NPV4tNfFhPrlbStzXNM8wSEcskwtpwi6aZfgQC7\n' +
    '/A7M1hN8Zk8WgiZjy05AHinWPvXo70OWj8TminIAjB2wh0nDqm+IQqN7r20uzeJm\n' +
    'GBf1KusGemChEiFwiad1h/OB9z9LC8zMYR/G+XAbFfcv8MxAMI9mgmS8t5+xeYm6\n' +
    'EMiCQkQjfqpErhW3oESj8hrdJdOZbiK3l0TgYLyjZRQu6pHzFkmd9We3BY1qcXo1\n' +
    '2BtNKvqoH9QDJItsb3S9v2mOGl1rbItKlDrqYCdGY4iyXVIfagNWHraVzHqH/ter\n' +
    'X+hOmLOwu+Npkz+oEDmnUq1UGY181PBGiNwHVodXx+DF5ckj/bGIxFG2nSiNe3dO\n' +
    'WLxV3+W8Af0006Oe+fRo1D7xt5SK5AipCpylKKYdyuP3MJ5dpPu7GMIcwj20Ndnu\n' +
    'cDJJ2HH9kZAKz6/r62S7ALluFSecuZr0Dqc6SrJs43zBTpS/hSI33r01ste6Zel8\n' +
    'uRZKW/4FhUg8gW1KCM+Mp1MaZufOurCDc1Iec0SI71Tteg52BTpfb8cQ9Z1h0xWR\n' +
    'FdbmLMLuJkIi5oG2+FLAqlGknik0AxXpnlivSOW5Q+eLOh0DjQxxU2sCAwEAAQ==\n' +
    '-----END RSA PUBLIC KEY-----\n',
  privateKey: '-----BEGIN RSA PRIVATE KEY-----\n' +
    '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\n' +
    '-----END RSA PRIVATE KEY-----\n'
}

2. Verschlüsselung mit öffentlichen Schlüsselncrypto提供各种加密、解密相关API。以下示例是基于Node@12.15.0版本进行编写。

const crypto = require('crypto');

/**
 * 生成公私钥对
 * @return {*} publicKey: 公钥;privateKey: 私钥
 */
function genRSAKeyPaire() {
  const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
    modulusLength: 4096,
    publicKeyEncoding: {
      type: 'pkcs1',
      format: 'pem',
    },
    privateKeyEncoding: {
      type: 'pkcs1',
      format: 'pem',
    },
  });

  return { publicKey, privateKey };
}

const { publicKey } = genRSAKeyPaire();

/**
   * 使用公钥进行加密
   * @param {String} data 
   * @param {String} publicKey 
   * @return {String} 加密后的密文
   */
function publicKeyEncrypt(data, publicKey) {
  return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64')
}

const entry = {
  name: 'zhangsan',
  password: '123456'
};

// 将数据转为字符串格式,并进行公钥加密后打印
console.log(publicKeyEncrypt(JSON.stringify(entry), publicKey));

输出示例如下:

(示例公私钥已被删除了一部分,请勿用于实验)

Ri0p8QFmnYe8Xo36DextK242o9pcdL0QFDo6gUxhzjwQD30UFlqJL57na445BebSp1VT1z94emJgrME7xTDzV1tshtmVNtarqCUCzZMF4uYAtZCQLJhCX3708g7lOFksiUvi6MlXCVVOIu2VyFsIS/6DeEWYNirPK6zEBw1e2V2jWoL+63+iGNyhtKFJI1ECGyMmXUWCMicUmgE/JiHJD7YXPKB9+WaB7Wglj5udBdd4fALUp7qIo8TWJZJkLUg5yMbe7kemNWk050Xi1KiEt3s8IAqoRB1qGghTmE/TW+M/jIblSSy3Urle1AYsOFUzh9wV/H+uD+UNdaCvlvfmdV8hTIjjLNy9r/GbuaI5N0TkaX/dk47iUuorZabPoINEnM8lYxcKPvgVJufMfSX5wLxgx60nt4cpz3T2IutO97sdocVbhsiSlpFLpIk88xd4=

2、公钥加密

在有了公私钥对的基础上,使用公钥进行加密,示例代码如下:

const crypto = require('crypto');

/**
 * 生成公私钥对
 * @return {*} publicKey: 公钥;privateKey: 私钥
 */
function genRSAKeyPaire() {
  const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
    modulusLength: 4096,
    publicKeyEncoding: {
      type: 'pkcs1',
      format: 'pem',
    },
    privateKeyEncoding: {
      type: 'pkcs1',
      format: 'pem',
    },
  });

  return { publicKey, privateKey };
}

const { publicKey, privateKey } = genRSAKeyPaire();

/**
   * 使用公钥进行加密
   * @param {String} data 
   * @param {String} publicKey 
   * @return {String} 加密后的密文
   */
function publicKeyEncrypt(data, publicKey) {
  return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64')
}

const entry = {
  name: 'zhangsan',
  password: '123456'
};

const encryptedData = publicKeyEncrypt(JSON.stringify(entry), publicKey);

/**
 * 使用私钥进行解密
 * @param {String} encryptedData 
 * @param {String} privateKey 
 * @return {String} 解密后的明文
 */
function privateKeyDecrypt(encryptedData, privateKey) {
  return crypto.privateDecrypt(privateKey, Buffer.from(encryptedData, 'base64')).toString();
}

const originData = privateKeyDecrypt(encryptedData, privateKey);

// 打印用私钥解密后的数据
console.log(originData);

输出内容为如下格式:

(数据已做删改)

{"name":"zhangsan","password":"123456"}

3、私钥解密

有了公钥加密后的密文,再用私钥进行解密,代码如下:

rrreee

输出结果:

rrreee

和我们上面定义的entry数据内容一致,说明解密成功,但是解密后是一个字符串,如果原始数据是一个对象的话,别忘记了将其反序列化为对象。

总结

在日常开发中,涉及到前后端通信,特别是重要的信息,为了防止被第三方获取从而加以利用,一般都会做一下通信传输加密,最基本的就是使用https

Basierend Verwenden Sie für das öffentliche und private Schlüsselpaar den folgenden Beispielcode:

rrreee

Der Ausgabeinhalt hat das folgende Format:

(Daten wurden gelöscht)rrreee

🎜🎜3 Schlüsselentschlüsselung🎜🎜🎜🎜Mit dem durch den öffentlichen Schlüssel verschlüsselten Chiffretext wird dann der private Schlüssel zum Entschlüsseln verwendet. Der Code lautet wie folgt: 🎜rrreee🎜Das Ausgabeergebnis: 🎜rrreee🎜 stimmt mit dem Eintragüberein > Der oben definierte Dateninhalt zeigt an, dass die Entschlüsselung erfolgreich war. Nach der Entschlüsselung handelt es sich jedoch um eine Zeichenfolge. Wenn es sich bei den Originaldaten um ein Objekt handelt, vergessen Sie nicht, es in ein Objekt zu deserialisieren. 🎜🎜🎜Zusammenfassung🎜🎜🎜In der täglichen Entwicklung sind Front-End- und Back-End-Kommunikation beteiligt, insbesondere wichtige Informationen. Um zu verhindern, dass Dritte diese erhalten und verwenden, wird im Allgemeinen eine Verschlüsselung der Kommunikationsübertragung durchgeführt um das https-Protokoll zu verwenden, 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. 🎜🎜Dieser Artikel ist beendet. 🎜🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial🎜! 🎜

Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, wie Node die Verschlüsselung und Entschlüsselung der Front-End- und Back-End-Datenübertragung implementiert.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen