Bagaimana Node mengimplementasikan enkripsi dan dekripsi transmisi data? Artikel berikut akan memperkenalkan kepada Anda bagaimana Node.js mengimplementasikan enkripsi dan dekripsi transmisi data front-end dan back-end. Saya harap ini dapat membantu Anda!
Kursus pengenalan singkat Node.js: masuk untuk belajar
Selama proses komunikasi front-end dan back-end, beberapa informasi sensitif, terutama akun pengguna dan kata sandi, perlu dienkripsi untuk transmisi. Cara memilih metode enkripsi juga merupakan ilmu, namun tidak perlu melangkah terlalu jauh Di Sini. Secara umum, enkripsi data transmisi yang paling umum digunakan dalam arsitektur B/S adalah enkripsi RSA. Ide intinya adalah enkripsi kunci publik dan dekripsi kunci pribadi . Kunci publik dapat dipahami sebagai kunci yang dapat dipublikasikan. Server mengirimkan kunci publik ke klien. Klien menggunakan kunci publik untuk mengenkripsi dan mengirimkan data memiliki kunci pribadi berpasangan. Dekripsi untuk mendapatkan data asli.
Proses umumnya ditunjukkan pada gambar di bawah ini:
Ada modul inti di Nodejs - crypto
yang menyediakan berbagai API terkait enkripsi dan dekripsi. Contoh berikut ditulis berdasarkan versi [email protected]
.
const kripto = memerlukan('kripto'); /** * Hasilkan pasangan kunci publik dan pribadi RSA * @return {*} publicKey: kunci publik; kunci pribadi: kunci pribadi */ fungsi genRSAKeyPaire() { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusPanjang: 4096, Pengkodean Kunci Publik: { ketik: 'pkcs1', format: 'pem', }, Pengkodean Kunci Pribadi: { ketik: 'pkcs1', format: 'pem', }, }); kembalikan { publicKey, privateKey }; } //Cetak pasangan kunci publik dan pribadi yang dihasilkan console.log(genRSAKeyPaire());
Contoh keluarannya adalah sebagai berikut:
(Sebagian dari contoh kunci publik dan pribadi telah dihapus, mohon jangan menggunakannya untuk eksperimen)
{ publicKey: '-----MULAI KUNCI PUBLIK 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' + '-----AKHIR KUNCI PUBLIK RSA-----n', privateKey: '-----MULAI KUNCI PRIBADI RSA-----n' + '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' + '-----AKHIR KUNCI PRIBADI RSA-----n' }
2. Enkripsi kunci publik
Berdasarkan pasangan kunci publik dan privat, kunci publik digunakan untuk enkripsi.
const kripto = memerlukan('kripto'); /** * Hasilkan pasangan kunci publik dan pribadi * @return {*} publicKey: kunci publik: kunci pribadi */ fungsi genRSAKeyPaire() { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusPanjang: 4096, Pengkodean Kunci Publik: { ketik: 'pkcs1', format: 'pem', }, Pengkodean Kunci Pribadi: { ketik: 'pkcs1', format: 'pem', }, }); kembalikan { publicKey, privateKey }; } const { publicKey } = genRSAKeyPaire(); /** * Gunakan kunci publik untuk enkripsi * @param {String} data * @param {String} kunci publik * @return {String} teks sandi terenkripsi */ fungsi publicKeyEncrypt(data, publicKey) { kembalikan crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } entri konstan = { nama: 'zhangsan', kata sandi: '123456' }; // Konversikan data ke format string, lakukan enkripsi kunci publik dan cetak console.log(publicKeyEncrypt(JSON.stringify(entry), publicKey));
Konten keluaran dalam format berikut:
(Data telah dihapus)
Ri0p8QFmnYe8Xo36DextK242o9pcdL0QFDo6gUxhzjwQD30UFlqJL57na445BebSp1VT1z94emJgrME7xTDzV1tshtmVNtarqCUCzZMF4uYAtZCQLJhCX3708g7lOFksiUvi6MlXCVVOIu2VyFs IS. +M/jIblSSy3Urle1AYsOFUzh9wV/H+uD+UNdaCvlvfmdV8hTIjjLNy9r/GbuaI5N0TkaX/dk47iUuorZabPoINEnM8lYxcKPvgVJufMfSX5wLxgx60nt4cpz3T2IutO97sdocVbhsiSlpFLpIk88 4=
3. Dekripsi kunci pribadi
Dengan ciphertext yang dienkripsi dengan kunci publik, gunakan kunci pribadi untuk mendekripsinya. Kodenya adalah sebagai berikut:
const kripto = memerlukan('kripto'); /** * Hasilkan pasangan kunci publik dan pribadi * @return {*} publicKey: kunci publik: kunci pribadi */ fungsi genRSAKeyPaire() { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusPanjang: 4096, Pengkodean Kunci Publik: { ketik: 'pkcs1', format: 'pem', }, Pengkodean Kunci Pribadi: { ketik: 'pkcs1', format: 'pem', }, }); kembalikan { publicKey, privateKey }; } const { publicKey, privateKey } = genRSAKeyPaire(); /** * Gunakan kunci publik untuk enkripsi * @param {String} data * @param {String} kunci publik * @return {String} teks sandi terenkripsi */ fungsi publicKeyEncrypt(data, publicKey) { kembalikan crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } entri konstan = { nama: 'zhangsan', kata sandi: '123456' }; const terenkripsiData = publicKeyEncrypt(JSON.stringify(entri), publicKey); /** * Dekripsi menggunakan kunci pribadi * @param {String} Data terenkripsi * @param {String} kunci pribadi * @return {String} teks biasa yang didekripsi */ fungsi privateKeyDecrypt(data terenkripsi, privateKey) { kembalikan crypto.privateDecrypt(privateKey, Buffer.from(encryptedData, 'base64')).toString(); } const originData = privateKeyDecrypt(data terenkripsi, privateKey); //Cetak data yang didekripsi dengan kunci pribadi console.log(originData);
Hasil keluaran:
{"nama":"zhangsan","kata sandi":"123456"}
Isi data entry
yang kita definisikan di atas konsisten, menandakan dekripsi berhasil, tetapi dekripsi berupa string. Jika data asli berupa objek, jangan lupa untuk melakukan deserialisasi menjadi objek.
Dalam perkembangan sehari-hari, dalam komunikasi front-end dan back-end, https
informasi penting, untuk mencegah pihak ketiga memperoleh dan menggunakannya, umumnya dilakukan enkripsi transmisi komunikasi , tetapi protokol https saja tidak cukup (Mudah dibajak dan diserang oleh man-in-the-middle). Oleh karena itu, data harus dienkripsi pada lapisan aplikasi untuk mencegah data dibajak dan digunakan oleh orang lain. Penggunaan enkripsi asimetris dapat memastikan bahwa ciphertext yang dikirim hanya dapat didekripsi oleh server dengan kunci pribadi, sehingga mencegah ciphertext tersebut didekripsi. didekripsi dan digunakan oleh pihak lain yang tidak terkait. Tidak ada keamanan mutlak di bidang Internet. Satu-satunya solusi jangka panjang adalah terus meningkatkan kesadaran keamanan Anda dan meningkatkan keterampilan keamanan Anda.