Como o Node implementa criptografia e descriptografia de transmissão de dados? O artigo a seguir apresentará como o Node.js implementa criptografia e descriptografia de transmissão de dados front-end e back-end. Espero que seja útil para você! 
Curso de introdução rápida ao Node.js: entre para aprender
Durante o processo de comunicação front-end e back-end, algumas informações confidenciais, especialmente a conta e a senha do usuário, precisam ser criptografadas para transmissão. Como escolher o método de criptografia também é uma ciência, mas não há necessidade de ir muito longe. aqui. De modo geral, a criptografia de dados de transmissão mais comumente usada na arquitetura B/S é a criptografia RSA. A ideia central é a criptografia de chave pública e a descriptografia de chave privada . A chave pública pode ser entendida como uma chave que pode ser tornada pública. O servidor envia a chave pública para o cliente e então usa a chave pública para criptografar e transmitir os dados. própria chave privada emparelhada. Descriptografe-a para obter os dados originais.
O processo geral é mostrado na figura abaixo:

Há um módulo principal no Nodejs - crypto que fornece várias APIs relacionadas à criptografia e descriptografia. Os exemplos a seguir foram escritos com base na versão [email protected] .
const criptografia = require('cripto');
/**
* Gere pares de chaves públicas e privadas RSA * @return {*} publicKey: public key; privateKey: chave privada */
função genRSAKeyPaire() {
const {publicKey, privateKey} = crypto.generateKeyPairSync('rsa', {
móduloComprimento: 4096,
publicKeyEncoding: {
digite: 'pkcs1',
formato: 'pem',
},
privateKeyEncoding: {
digite: 'pkcs1',
formato: 'pem',
},
});
return {publicKey, privateKey};
}
//Imprime os pares de chaves pública e privada gerados console.log(genRSAKeyPaire());A saída de exemplo é a seguinte:
(Parte da amostra de chaves públicas e privadas foi excluída, por favor, não a use para experimentos)
{
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' +
'-----FIM CHAVE PÚBLICA RSA-----n',
privateKey: '-----BEGIN RSA PRIVATE KEY-----n' +
'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' +
'-----FIM CHAVE PRIVADA RSA-----n'
}2. Criptografia de chave pública
Com base no par de chaves pública e privada, a chave pública é usada para criptografia. O código de exemplo é o seguinte:
const criptografia = require('cripto');
/**
* Gere um par de chaves pública e privada * @return {*} publicKey: public key; privateKey: private key */
função genRSAKeyPaire() {
const {publicKey, privateKey} = crypto.generateKeyPairSync('rsa', {
móduloComprimento: 4096,
publicKeyEncoding: {
digite: 'pkcs1',
formato: 'pem',
},
privateKeyEncoding: {
digite: 'pkcs1',
formato: 'pem',
},
});
return {publicKey, privateKey};
}
const {publicKey} = genRSAKeyPaire();
/**
* Use chave pública para criptografia * @param {String} dados
* @param {String} chave pública
* @return {String} texto cifrado criptografado */
function publicKeyEncrypt(dados, publicKey) {
retornar crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64')
}
entrada constante = {
nome: 'zhangsan',
senha: '123456'
};
// Converta os dados para o formato string, execute a criptografia de chave pública e imprima console.log(publicKeyEncrypt(JSON.stringify(entry), publicKey));O conteúdo de saída está no seguinte formato:
(Os dados foram excluídos)
Ri0p8QFmnYe8Xo36DextK242o9pcdL0QFDo6gUxhzjwQD30UFlqJL57na445BebSp1VT1z94emJgrME7xTDzV1tshtmVNtarqCUCzZMF4uYAtZCQLJhCX3708g7lOFksiUvi6MlXCVVOIu2Vy FSIS RB1qGghTmE/TW +M/jIblSSy3Urle1AYsOFUzh9wV/H+uD+UNdaCvlvfmdV8hTIjjLNy9r/GbuaI5N0TkaX/dk47iUuorZabPoINEnM8lYxcKPvgVJufMfSX5wLxgx60nt4cpz3T2IutO97sdoc VbhsiSlpFLpIk88 xd4=
3. Descriptografia de chave privada
Com o texto cifrado criptografado pela chave pública, use a chave privada para descriptografá-lo.
const criptografia = require('cripto');
/**
* Gere um par de chaves pública e privada * @return {*} publicKey: public key; privateKey: private key */
função genRSAKeyPaire() {
const {publicKey, privateKey} = crypto.generateKeyPairSync('rsa', {
móduloComprimento: 4096,
publicKeyEncoding: {
digite: 'pkcs1',
formato: 'pem',
},
privateKeyEncoding: {
digite: 'pkcs1',
formato: 'pem',
},
});
return {publicKey, privateKey};
}
const {publicKey, privateKey } = genRSAKeyPaire();
/**
* Use chave pública para criptografia * @param {String} dados
* @param {String} chave pública
* @return {String} texto cifrado criptografado */
function publicKeyEncrypt(dados, publicKey) {
retornar crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64')
}
entrada constante = {
nome: 'zhangsan',
senha: '123456'
};
const criptografadoData = publicKeyEncrypt(JSON.stringify(entrada), publicKey);
/**
* Descriptografar usando chave privada * @param {String} criptografadoData
* @param {String} chave privada
* @return {String} texto simples descriptografado */
function privateKeyDecrypt(dadoscriptografados, privateKey) {
retornar crypto.privateDecrypt(privateKey, Buffer.from(encryptedData, 'base64')).toString();
}
const originData = privateKeyDecrypt(encryptedData, privateKey);
//Imprime os dados descriptografados com a chave privada console.log(originData);Resultado de saída:
{"nome":"zhangsan","senha":"123456"} O conteúdo dos dados entry que definimos acima é consistente, indicando que a descriptografia foi bem-sucedida, mas a descriptografia é uma string. Se os dados originais forem um objeto, não se esqueça de desserializá-los em um objeto.
No desenvolvimento diário, quando se trata de comunicação front-end e back-end, https informações importantes, para evitar que terceiros as obtenham e utilizem, geralmente é realizada a criptografia de transmissão de comunicação. , mas o protocolo https por si só não é suficiente (fácil de ser sequestrado e atacado por um intermediário). Portanto, os dados devem ser criptografados na camada de aplicação para evitar que os dados sejam sequestrados e usados por outros. O uso da criptografia assimétrica pode garantir que o texto cifrado enviado só possa ser descriptografado pelo servidor com a chave privada, evitando assim que o texto cifrado seja. descriptografado e usado por outras partes não relacionadas. Não existe segurança absoluta no campo da Internet. A única solução a longo prazo é melhorar continuamente a sua consciência de segurança e melhorar as suas competências em segurança.