Comment Node implémente-t-il le cryptage et le déchiffrement de la transmission de données ? L'article suivant vous présentera comment Node.js implémente le cryptage et le déchiffrement de la transmission de données front-end et back-end. J'espère qu'il vous sera utile !
Cours d'introduction rapide à Node.js : participez pour apprendre
Au cours du processus de communication front-end et back-end, certaines informations sensibles, notamment le compte et le mot de passe de l'utilisateur, doivent être cryptées pour la transmission. Le choix de la méthode de cryptage est également une science, mais il n'est pas nécessaire d'aller trop loin. ici. D'une manière générale, le cryptage des données de transmission le plus couramment utilisé dans l'architecture B/S est le cryptage RSA. L'idée centrale est le cryptage par clé publique et le déchiffrement par clé privée . La clé publique peut être comprise comme une clé qui peut être rendue publique. Le serveur envoie la clé publique au client. Le client utilise la clé publique pour chiffrer et transmettre les données. Le serveur reçoit le texte chiffré du client et utilise ensuite son. propre clé privée couplée. Déchiffrez-la pour obtenir les données originales.
Le processus général est illustré dans la figure ci-dessous :
Il existe un module de base dans Nodejs - crypto
qui fournit diverses API liées au chiffrement et au déchiffrement. Les exemples suivants sont écrits sur la base de la version [email protected]
.
const crypto = require('crypto'); /** * Générer des paires de clés publiques et privées RSA * @return {*} publicKey : clé publique : clé privée */ fonction genRSAKeyPaire() { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { moduleLongueur: 4096, publicKeyEncoding : { tapez : 'pkcs1', format : 'pem', }, privateKeyEncoding : { tapez : 'pkcs1', format : 'pem', }, }); return {publicKey, privateKey } ; } //Imprime les paires de clés publiques et privées générées console.log(genRSAKeyPaire());
Un exemple de résultat est le suivant :
(Une partie des exemples de clés publiques et privées a été supprimée, veuillez ne pas l'utiliser pour des expériences)
{ publicKey : '-----DEBUT DE LA CLÉ PUBLIQUE 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' + '-----FIN CLÉ PUBLIQUE RSA-----n', privateKey : '-----BEGIN RSA PRIVATE KEY-----n' + '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' + '-----FIN CLÉ PRIVÉE RSA-----n' }
2. Cryptage à clé publique
Sur la base de la paire de clés publique et privée, la clé publique est utilisée pour le chiffrement. L'exemple de code est le suivant :
const crypto = require('crypto'); /** * Générer une paire de clés publique et privée * @return {*} publicKey : clé publique : clé privée */ fonction genRSAKeyPaire() { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { moduleLongueur: 4096, publicKeyEncoding : { tapez : 'pkcs1', format : 'pem', }, privateKeyEncoding : { tapez : 'pkcs1', format : 'pem', }, }); return {publicKey, privateKey } ; } const { publicKey } = genRSAKeyPaire(); /** * Utiliser la clé publique pour le cryptage * Données @param {String} * @param {String} clé publique * @return {String} texte chiffré */ fonction publicKeyEncrypt (données, publicKey) { return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } entrée const = { nom : 'zhangsan', mot de passe : '123456' } ; // Convertit les données au format chaîne, effectue un cryptage à clé publique et imprime console.log(publicKeyEncrypt(JSON.stringify(entry), publicKey));
Le contenu de sortie est au format suivant :
(Les données ont été supprimées)
Ri0p8QFmnYe8Xo36DextK242o9pcdL0QFDo6gUxhzjwQD30UFlqJL57na445BebSp1VT1z94emJgrME7xTDzV1tshtmVNtarqCUCzZMF4uYAtZCQLJhCX3708g7lOFksiUvi6MlXCVVOIu2VyFs IS /6DeEWYNirPK6zEBw1e2V2jWoL+63+iGNyhtKFJI1ECGyMmXUWCMicUmgE/JiHJD7YXPKB9+WaB7Wglj5udBdd4fALUp7qIo8TWJZJkLUg5yMbe7kemNWk050Xi1KiEt3s8IAqoRB1qGghTmE/TW +M/jIblSSy3Urle1AYsOFUzh9wV/H+uD+UNdaCvlvfmdV8hTIjjLNy9r/GbuaI5N0TkaX/dk47iUuorZabPoINEnM8lYxcKPvgVJufMfSX5wLxgx60nt4cpz3T2IutO97sdocVbhsiSlpFLpIk88 xd4=
3. Décryptage de la clé privée
Le texte chiffré étant chiffré par la clé publique, utilisez la clé privée pour le déchiffrer. Le code est le suivant :
const crypto = require('crypto'); /** * Générer une paire de clés publique et privée * @return {*} publicKey : clé publique : clé privée */ fonction genRSAKeyPaire() { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { moduleLongueur: 4096, publicKeyEncoding : { tapez : 'pkcs1', format : 'pem', }, privateKeyEncoding : { tapez : 'pkcs1', format : 'pem', }, }); return {publicKey, privateKey } ; } const { publicKey, privateKey } = genRSAKeyPaire(); /** * Utiliser la clé publique pour le cryptage * Données @param {String} * @param {String} clé publique * @return {String} texte chiffré */ fonction publicKeyEncrypt (données, publicKey) { return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } entrée const = { nom : 'zhangsan', mot de passe : '123456' } ; const selectedData = publicKeyEncrypt(JSON.stringify(entry), publicKey); /** * Décrypter à l'aide d'une clé privée * @param {String} selectedData * @param {String} clé privée * @return {String} texte brut déchiffré */ fonction privateKeyDecrypt (encryptedData, privateKey) { return crypto.privateDecrypt(privateKey, Buffer.from(encryptedData, 'base64')).toString(); } const originData = privateKeyDecrypt(encryptedData, privateKey); //Imprime les données décryptées avec la clé privée console.log(originData);
Résultat de sortie :
{"nom": "zhangsan", "mot de passe": "123456"}
Le contenu des données entry
que nous avons définies ci-dessus est cohérent, indiquant que le déchiffrement est réussi, mais le déchiffrement est une chaîne. Si les données d'origine sont un objet, n'oubliez pas de le désérialiser en objet.
Dans le développement quotidien, lorsqu'il s'agit de communications front-end et back-end, notamment d'informations importantes, afin d'empêcher des tiers de les obtenir et de les utiliser, le cryptage de la transmission des communications est généralement effectué. La méthode la plus élémentaire consiste à utiliser le protocole https
. , mais le protocole https à lui seul ne suffit pas (facile à détourner et à attaquer par un homme du milieu). Par conséquent, les données doivent être chiffrées au niveau de la couche application pour éviter qu'elles ne soient détournées et utilisées par d'autres. L'utilisation du chiffrement asymétrique peut garantir que le texte chiffré envoyé ne peut être déchiffré que par le serveur avec la clé privée, empêchant ainsi le texte chiffré d'être déchiffré. décrypté et utilisé par d’autres parties indépendantes. Il n’existe pas de sécurité absolue dans le domaine Internet. La seule solution à long terme consiste à améliorer continuellement votre sensibilisation à la sécurité et à renforcer vos compétences en matière de sécurité.