Jawaban yang ada yang memanfaatkan SJCL, CryptoJS, dan / atau WebCrypto tidak selalu salah tetapi tidak seaman yang awalnya Anda duga. Umumnya Anda ingin menggunakan libsodium . Pertama saya akan menjelaskan mengapa, lalu bagaimana.
Mengapa Tidak SJCL, CryptoJS, WebCrypto, dll?
Jawaban singkat: Agar enkripsi Anda benar-benar aman, perpustakaan ini mengharapkan Anda untuk membuat terlalu banyak pilihan, misalnya mode blok cipher (CBC, CTR, GCM; jika Anda tidak tahu yang mana dari tiga yang saya daftarkan aman untuk gunakan dan di bawah kendala apa, Anda seharusnya tidak terbebani dengan pilihan semacam ini sama sekali ).
Kecuali jika jabatan Anda adalah insinyur kriptografi , kemungkinan besar Anda tidak dapat menerapkannya dengan aman.
Mengapa Harus Menghindari CryptoJS?
CryptoJS menawarkan beberapa blok bangunan dan mengharapkan Anda tahu cara menggunakannya dengan aman. Bahkan default ke mode CBC ( diarsipkan ).
Mengapa mode CBC buruk?
Baca artikel ini tentang kerentanan AES-CBC .
Mengapa Harus Menghindari WebCrypto?
WebCrypto adalah standar potluck, dirancang oleh komite, untuk tujuan yang ortogonal untuk teknik kriptografi. Secara khusus, WebCrypto dimaksudkan untuk menggantikan Flash, bukan memberikan keamanan .
Mengapa Harus Menghindari SJCL?
API dan dokumentasi publik SJCL memohon pengguna untuk mengenkripsi data dengan kata sandi yang diingat manusia. Ini jarang, jika pernah, apa yang ingin Anda lakukan di dunia nyata.
Selain itu: Jumlah putaran standar PBKDF2 kira-kira 86 kali lebih kecil dari yang Anda inginkan . AES-128-CCM mungkin baik-baik saja.
Dari tiga opsi di atas, SJCL adalah yang paling mungkin berakhir dengan menangis. Tetapi ada opsi yang lebih baik tersedia.
Mengapa Libsodium Lebih Baik?
Anda tidak perlu memilih antara menu mode sandi, fungsi hash, dan opsi lain yang tidak perlu. Anda tidak akan pernah berisiko mengacaukan parameter Anda dan menghapus semua keamanan dari protokol Anda .
Sebagai gantinya, libsodium hanya memberi Anda opsi sederhana yang disetel untuk keamanan maksimum dan API minimalis.
crypto_box()
/ crypto_box_open()
tawarkan enkripsi kunci publik terotentikasi.
- Algoritme yang dimaksud menggabungkan X25519 (ECDH over Curve25519) dan XSalsa20-Poly1305, tetapi Anda tidak perlu tahu (atau bahkan peduli) tentang itu untuk menggunakannya dengan aman
crypto_secretbox()
/ crypto_secretbox_open()
tawarkan enkripsi autentikasi bersama-kunci.
- Algoritma yang dimaksud adalah XSalsa20-Poly1305, tetapi Anda tidak perlu tahu / peduli
Selain itu, libsodium memiliki ikatan dalam lusinan bahasa pemrograman populer , sehingga sangat mungkin bahwa libsodium hanya akan berfungsi ketika mencoba untuk beroperasi dengan tumpukan pemrograman lain. Juga, libsodium cenderung sangat cepat tanpa mengorbankan keamanan.
Bagaimana Cara Menggunakan Libsodium dalam JavaScript?
Pertama, Anda perlu memutuskan satu hal:
- Apakah Anda hanya ingin mengenkripsi / mendekripsi data (dan mungkin masih menggunakan plaintext dalam kueri basis data dengan aman) dan tidak khawatir tentang detailnya? Atau...
- Apakah Anda perlu menerapkan protokol tertentu?
Jika Anda memilih opsi pertama , dapatkan CipherSweet.js .
Dokumentasi tersedia online . EncryptedField
cukup untuk sebagian besar kasus penggunaan, tetapi API EncryptedRow
dan EncryptedMultiRows
mungkin lebih mudah jika Anda memiliki banyak bidang berbeda yang ingin Anda enkripsi.
Dengan CipherSweet, Anda bahkan tidak perlu tahu apa itu nonce / IV untuk menggunakannya dengan aman.
Selain itu, ini menangani int
/ float
enkripsi tanpa membocorkan fakta tentang konten melalui ukuran ciphertext.
Jika tidak, Anda akan menginginkan sodium-plus , yang merupakan antarmuka yang mudah digunakan untuk berbagai pembungkus libsodium. Sodium-Plus memungkinkan Anda untuk menulis kode lintas platform yang performan, tidak sinkron, dan mudah untuk diaudit.
Untuk menginstal natrium-plus, jalankan saja ...
npm install sodium-plus
Saat ini tidak ada CDN publik untuk dukungan browser. Ini akan segera berubah. Namun, Anda dapat mengambil sodium-plus.min.js
dari rilis Github terbaru jika Anda membutuhkannya.
const { SodiumPlus } = require('sodium-plus');
let sodium;
(async function () {
if (!sodium) sodium = await SodiumPlus.auto();
let plaintext = 'Your message goes here';
let key = await sodium.crypto_secretbox_keygen();
let nonce = await sodium.randombytes_buf(24);
let ciphertext = await sodium.crypto_secretbox(
plaintext,
nonce,
key
);
console.log(ciphertext.toString('hex'));
let decrypted = await sodium.crypto_secretbox_open(
ciphertext,
nonce,
key
);
console.log(decrypted.toString());
})();
Dokumentasi untuk natrium-plus tersedia di Github.
Jika Anda ingin tutorial langkah demi langkah, artikel dev.to ini memiliki apa yang Anda cari.