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.