¿Cómo implementa Node el cifrado y descifrado de la transmisión de datos? El siguiente artículo le presentará cómo Node.js implementa el cifrado y descifrado de la transmisión de datos de front-end y back-end. ¡Espero que le resulte útil!
Curso de introducción rápida a Node.js: entra para aprender
Durante el proceso de comunicación front-end y back-end, parte de la información confidencial, especialmente la cuenta y la contraseña del usuario, debe cifrarse para su transmisión. Cómo elegir el método de cifrado también es una ciencia, pero no es necesario ir demasiado lejos. aquí. En términos generales, el cifrado de datos de transmisión más utilizado en la arquitectura B/S es el cifrado RSA. La idea central es el cifrado de clave pública y el descifrado de clave privada . La clave pública puede entenderse como una clave que puede hacerse pública. El servidor envía la clave pública al cliente. El cliente utiliza la clave pública para cifrar y transmitir los datos. El servidor recibe el texto cifrado del cliente. propia clave privada emparejada. Descifrédela para obtener los datos originales.
El proceso general se muestra en la siguiente figura:
Hay un módulo principal en Nodejs: crypto
que proporciona varias API relacionadas con el cifrado y descifrado. Los siguientes ejemplos están escritos en base a la versión [email protected]
.
const cripto = requerir('cripto'); /** * Generar pares de claves públicas y privadas RSA * @return {*} publicKey: clave pública privateKey: clave privada */ función genRSAKeyPaire() { const {clave pública, clave privada} = crypto.generateKeyPairSync('rsa', { móduloLongitud: 4096, codificación de clave pública: { escriba: 'pkcs1', formato: 'pem', }, codificación de clave privada: { escriba: 'pkcs1', formato: 'pem', }, }); devolver {clave pública, clave privada}; } //Imprime los pares de claves pública y privada generados console.log(genRSAKeyPaire());
El resultado del ejemplo es el siguiente:
(Se ha eliminado parte de las claves públicas y privadas de muestra; no las utilice para experimentos)
{ publicKey: '-----COMENZAR CLAVE PÚBLICA RSA-----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' + '-----TERMINAR LA CLAVE PÚBLICA RSA-----n', clave privada: '-----COMENZAR CLAVE PRIVADA RSA-----n' + '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' + '-----FIN DE CLAVE PRIVADA RSA-----n' }
2. Cifrado de clave pública
Según el par de claves pública y privada, la clave pública se utiliza para el cifrado. El código de muestra es el siguiente:
const cripto = requerir('cripto'); /** * Generar un par de claves pública y privada * @return {*} publicKey: clave pública privateKey: clave privada */ función genRSAKeyPaire() { const {clave pública, clave privada} = crypto.generateKeyPairSync('rsa', { móduloLongitud: 4096, codificación de clave pública: { escriba: 'pkcs1', formato: 'pem', }, codificación de clave privada: { escriba: 'pkcs1', formato: 'pem', }, }); devolver {clave pública, clave privada}; } const {publicKey} = genRSAKeyPaire(); /** * Utilice clave pública para el cifrado * @param {String} datos * @param {Cadena} clave pública * @return {String} texto cifrado cifrado */ función publicKeyEncrypt(datos, publicKey) { devolver crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } entrada constante = { nombre: 'zhangsan', contraseña: '123456' }; // Convierte los datos al formato de cadena, realiza el cifrado de clave pública e imprime console.log(publicKeyEncrypt(JSON.stringify(entry), publicKey));
El contenido de salida tiene el siguiente formato:
(Los datos han sido eliminados)
Ri0p8QFmnYe8Xo36DextK242o9pcdL0QFDo6gUxhzjwQD30UFlqJL57na445BebSp1VT1z94emJgrME7xTDzV1tshtmVNtarqCUCzZMF4uYAtZCQLJhCX3708g7lOFksiUvi6MlXCVVOIu2V yFsIS /6DeEWYNirPK6zEBw1e2V2jWoL+63+iGNyhtKFJI1ECGyMmXUWCMicUmgE/JiHJD7YXPKB9+WaB7Wglj5udBdd4fALUp7qIo8TWJZJkLUg5yMbe7kemNWk050Xi1KiEt3s8IAqoRB1qG ghTmE/TW +M/jiblSSy3Urle1AYsOFUzh9wV/H+uD+UNdaCvlvfmdV8hTIjjLNy9r/GbuaI5N0TkaX/dk47iUuorZabPoINEnM8lYxcKPvgVJufMfSX5wLxgx60nt4cpz3T2IutO97sdocVbhsiSlpFL pIk88 xd4=
3. Descifrado de clave privada
Con el texto cifrado cifrado con la clave pública, utilice la clave privada para descifrarlo. El código es el siguiente:
const cripto = requerir('cripto'); /** * Generar un par de claves pública y privada * @return {*} publicKey: clave pública privateKey: clave privada */ función genRSAKeyPaire() { const {clave pública, clave privada} = crypto.generateKeyPairSync('rsa', { móduloLongitud: 4096, codificación de clave pública: { escriba: 'pkcs1', formato: 'pem', }, codificación de clave privada: { escriba: 'pkcs1', formato: 'pem', }, }); devolver {clave pública, clave privada}; } const {clave pública, clave privada} = genRSAKeyPaire(); /** * Utilice clave pública para el cifrado * @param {String} datos * @param {Cadena} clave pública * @return {String} texto cifrado cifrado */ función publicKeyEncrypt(datos, publicKey) { devolver crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } entrada constante = { nombre: 'zhangsan', contraseña: '123456' }; const encryptedData = publicKeyEncrypt(JSON.stringify(entrada), publicKey); /** * Descifrar usando clave privada * @param {String} encryptedData * @param {String} clave privada * @return {String} texto plano descifrado */ función claveprivadaDecrypt (datos cifrados, clave privada) { return crypto.privateDecrypt(privateKey, Buffer.from(encryptedData, 'base64')).toString(); } const originData = privateKeyDecrypt(encryptedData, privateKey); //Imprime los datos descifrados con la clave privada console.log(originData);
Resultado de salida:
{"nombre":"zhangsan","contraseña":"123456"}
El contenido de entry
que definimos anteriormente es consistente, lo que indica que el descifrado se realizó correctamente, pero el descifrado es una cadena. Si los datos originales son un objeto, no olvide deserializarlos en un objeto.
En el desarrollo diario, cuando se trata de comunicación front-end y back-end, información especialmente importante, para evitar que terceros la obtengan y la utilicen, generalmente se realiza el cifrado de transmisión de comunicación. El más básico es utilizar el protocolo https
. , pero el protocolo https por sí solo no es suficiente (es fácil ser secuestrado y atacado por un intermediario). Por lo tanto, los datos deben cifrarse en la capa de aplicación para evitar que otros los secuestren y utilicen. El uso de cifrado asimétrico puede garantizar que el texto cifrado enviado solo pueda ser descifrado por el servidor con la clave privada, evitando así que el texto cifrado sea cifrado. descifrado y utilizado por otras partes no relacionadas. No existe una seguridad absoluta en el campo de Internet. La única solución a largo plazo es mejorar continuamente su conciencia de seguridad y mejorar sus habilidades de seguridad.