Saya tertarik membangun aplikasi kecil untuk penggunaan pribadi yang akan mengenkripsi dan mendekripsi informasi di sisi klien menggunakan JavaScript. Informasi terenkripsi akan disimpan dalam database di server, tetapi tidak pernah versi yang dienkripsi.
Tidak harus super duper aman, tapi saya ingin menggunakan algoritma yang saat ini tidak terputus.
Idealnya saya bisa melakukan sesuatu seperti
var gibberish = encrypt(string, salt, key);
untuk menghasilkan string yang disandikan, dan sesuatu seperti
var sensical = decrypt(gibberish, key);
untuk memecahkan kode nanti.
Sejauh ini saya telah melihat ini: http://bitwiseshiftleft.github.io/sjcl/
Ada perpustakaan lain yang harus saya lihat?
encryption
javascript
Yeremia
sumber
sumber
Jawaban:
sumber
Bagaimana dengan CryptoJS ?
Ini adalah perpustakaan crypto yang solid, dengan banyak fungsi. Ini mengimplementasikan hashers, HMAC, PBKDF2 dan cipher. Dalam hal ini, sandi adalah yang Anda butuhkan. Lihat rangkuman mulai cepat di beranda proyek.
Anda dapat melakukan sesuatu seperti dengan AES:
Sedangkan untuk keamanan, saat ini saya menulis algoritma AES dianggap tidak terputus
Edit:
Tampaknya URL online tidak aktif & Anda dapat menggunakan file yang diunduh untuk enkripsi dari tautan yang diberikan di bawah ini & letakkan file tersebut di folder root aplikasi Anda.
https://code.google.com/archive/p/crypto-js/downloads
atau menggunakan CDN lain seperti https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js
sumber
Saya membuat util text cipher / decipher sederhana namun tidak aman. Tidak ada ketergantungan dengan perpustakaan eksternal.
Inilah fungsinya
Dan Anda dapat menggunakannya sebagai berikut:
sumber
let
. 😒︎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.crypto_secretbox()
/crypto_secretbox_open()
tawarkan enkripsi autentikasi bersama-kunci.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:
Jika Anda memilih opsi pertama , dapatkan CipherSweet.js .
Dokumentasi tersedia online .
EncryptedField
cukup untuk sebagian besar kasus penggunaan, tetapi APIEncryptedRow
danEncryptedMultiRows
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 ...
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.Dokumentasi untuk natrium-plus tersedia di Github.
Jika Anda ingin tutorial langkah demi langkah, artikel dev.to ini memiliki apa yang Anda cari.
sumber
Browser modern sekarang mendukung
crypto.subtle
API, yang menyediakan fungsi enkripsi dan dekripsi asli (async tidak kurang!) Menggunakan salah satu metode ini: AES-CBC, AES-CTR, AES-GCM, atau RSA-OAEP.https://www.w3.org/TR/WebCryptoAPI/#dfn-Crypto
sumber
Sebelum menerapkan semua ini, silakan lihat jawaban Scott Arciszewski .
Saya ingin Anda sangat berhati - hati dengan apa yang akan saya bagikan karena saya memiliki sedikit atau tidak ada pengetahuan keamanan (Ada kemungkinan besar saya menyalahgunakan API di bawah ini), jadi saya akan sangat menyambut untuk memperbarui jawaban ini dengan bantuan komunitas .
Seperti @richardtallent disebutkan dalam jawabannya , ada dukungan untuk Web Crypto API, jadi contoh ini menggunakan standar. Pada tulisan ini, ada 95,88% dukungan browser global .
Saya akan membagikan contoh menggunakan Web Crypto API
Sebelum kami melanjutkan, harap dicatat ( Mengutip dari MDN ):
Saya sangat menghormati keamanan, dan saya bahkan berani bagian tambahan dari MDN ... Anda telah diperingatkan
Sekarang, untuk contoh aktual ...
JSFiddle:
Ditemukan di sini: https://jsfiddle.net/superjose/rm4e0gqa/5/
catatan:
Perhatikan penggunaan
await
kata kunci. Gunakan di dalamasync
fungsi atau gunakan.then()
dan.catch()
.Hasilkan kunci:
Enkripsi:
Dekripsi
Konversi ArrayBuffer bolak-balik dari String (Selesai dalam TypeScript):
Anda dapat menemukan lebih banyak contoh di sini (saya bukan pemiliknya): // https://github.com/diafygi/webcrypto-examples
sumber
CryptoJS tidak lagi didukung. Jika Anda ingin terus menggunakannya, Anda dapat beralih ke url ini:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
sumber
Gunakan SimpleCrypto
Menggunakan enkripsi () dan dekripsi ()
sumber
Fungsi sederhana,
sumber