Enkripsi AES Javascript [ditutup]

109

Apakah ada perpustakaan yang tersedia untuk enkripsi AES 256-bit di Javascript?

pembuat kode
sumber
Inilah yang Anda perlukan untuk enkripsi AES menggunakan crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt ("Message", "Passphrase"); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), "Passphrase"); console.log ("Encrypted:", encryptedAES.toString ()); console.log ( "Decrypted:", decrypted.toString (CryptoJS.enc.Utf8)); </script>
Hari Das

Jawaban:

66

JSAES adalah implementasi yang kuat dari AES di JavaScript. http://point-at-infinity.org/jsaes/

garis miring terbalik17
sumber
32
JSAES dilisensikan di bawah GNU GPL - oleh karena itu tidak dapat digunakan untuk beberapa proyek.
Robert
11
Ini sekarang cukup berguna dan kaya fitur code.google.com/p/crypto-js
David Kierans
2
@HappyDeveloper Nah, tidak. Jangan salahkan lisensi untuk ini. Penulis telah memilih lisensi yang salah, karena GPL tidak cocok untuk perpustakaan.
inta
4
Ini "bebas biaya untuk digunakan", tetapi Anda tidak dapat menggunakannya jika Anda ingin merilis produk yang Anda hasilkan di bawah sesuatu selain GPL.
Curtis
3
JSAES adalah titik awal yang baik tetapi hanya dapat digunakan untuk mengenkripsi 16 byte data. Jika Anda ingin mengenkripsi blok data yang lebih besar, Anda harus memperluasnya sendiri untuk mengimplementasikan vektor inisialisasi, mode enkripsi (CBC atau lainnya ...), padding.
Paolo
35

Berikut adalah halaman demonstrasi yang menggunakan slowAES.

slowAES mudah digunakan. Didesain secara logis. Kemasan OO yang wajar. Mendukung kenop dan tuas seperti mode IV dan Enkripsi. Kompatibilitas yang baik dengan .NET / C #. Namanya lidah di pipi; ini disebut " AES lambat " karena tidak diterapkan di C ++. Tapi dalam pengujian saya itu tidak terlalu lambat.

Itu tidak memiliki mode ECB. Juga tidak memiliki mode CTR, meskipun Anda bisa membuatnya dengan cukup mudah dengan mode ECB, saya rasa.

Ini hanya berfokus pada enkripsi. Kelas pelengkap yang bagus yang melakukan turunan kunci berbasis kata sandi RFC2898 , dalam Javascript, tersedia dari Anandam . Sepasang pustaka ini bekerja dengan baik dengan kelas .NET analog. Interop yang bagus. Padahal, berbeda dengan SlowAES, PBKDF2 Javascript terasa lebih lambat daripada kelas Rfc2898DeriveBytes saat membuat kunci.

Tidak mengherankan jika secara teknis ada interop yang bagus, tetapi poin kuncinya bagi saya adalah model yang diadopsi oleh SlowAES sudah familiar dan mudah digunakan. Saya menemukan beberapa perpustakaan Javascript lain untuk AES menjadi sulit untuk dipahami dan digunakan. Misalnya, di beberapa dari mereka saya tidak dapat menemukan tempat untuk mengatur IV, atau mode (CBC, ECB, dll). Hal-hal tidak seperti yang saya harapkan. SlowAES tidak seperti itu. Properti berada tepat di tempat yang saya harapkan. Mudah bagi saya untuk mengambilnya, karena telah terbiasa dengan model pemrograman kripto Java dan .NET.

PBKDF2 Anandam tidak cukup di level itu. Ini hanya mendukung satu panggilan ke fungsi DeriveBytes, jadi jika Anda perlu mendapatkan kunci dan IV dari kata sandi, pustaka ini tidak akan berfungsi, tidak berubah. Sedikit modifikasi, dan berfungsi dengan baik untuk tujuan itu.

EDIT : Saya mengumpulkan contoh pengemasan SlowAES dan versi modifikasi dari PBKDF2 Anandam ke dalam Komponen Skrip Windows. Menggunakan AES ini dengan kunci turunan kata sandi menunjukkan interop yang baik dengan kelas .NET RijndaelManaged.

EDIT2 : halaman demo menunjukkan bagaimana menggunakan enkripsi AES ini dari halaman web. Menggunakan input yang sama (iv, key, mode, dll) yang didukung di .NET memberi Anda interop yang baik dengan kelas .NET Rijndael. Anda dapat melakukan "lihat sumber" untuk mendapatkan javascript untuk halaman tersebut.

EDIT3
tambahan terlambat: Kriptografi Javascript dianggap berbahaya. Layak dibaca.

Cheeso
sumber
8
+1 untuk Kriptografi JavaScript dianggap berbahaya
Mike Pennington
1
Saya melihat satu kasus penggunaan yang valid - aplikasi HTML 5 tempat semua file disimpan secara lokal. Jika file lokal dapat dibajak maka Anda akan binasa ;-).
Nux
8
tentang tautan edit3, itu adalah bagian dari artikel yang tidak benar ... setengah dari pernyataannya sepenuhnya salah!
mmm
2
Masalah kunci acak dapat diatasi dengan meminta pengguna menggerakkan mouse dan memasukkan kunci sebagai generator acak yang sebenarnya.
mmm
2
Link ke halaman demonstrasi tampaknya rusak.
Sean
26

Dalam pencarian saya untuk enkripsi AES, saya menemukan ini dari beberapa siswa Standford. Mengklaim sebagai yang tercepat di luar sana. Mendukung enkripsi CCM, OCB, GCM dan Blokir. http://crypto.stanford.edu/sjcl/

Danny C
sumber
itulah yang saya bicarakan!
mmm
5
Dokumentasi kurang, dan sulit digunakan. Bagaimana Anda mengubah panjang kunci? Saya mencari-cari dokumen dan tidak bisa mengetahuinya dalam waktu yang wajar. Juga ketika Anda mengenkripsi sesuatu, Anda mendapatkan larik pasangan nilai-kunci yang dikembalikan, tetapi dokumen tampaknya tidak menjelaskan ini. Saya akhirnya menggunakan perpustakaan tipe bergerak.
CpnCrunch
Dan ini tidak asinkron jadi jika Anda mengenkripsi atau mendekripsi beberapa string yang lebih panjang misalnya dengan AES-CBC, maka itu memblokir UI
rsz
12

Googling "JavaScript AES" telah menemukan beberapa contoh. Yang pertama yang muncul dirancang untuk menjelaskan algoritme serta memberikan solusi:

Skrip Jenis Bergerak: AES

Samir Talwar
sumber
1
Saya tidak tahu bagaimana mengatur IV di perpustakaan itu. Juga tidak terlalu OO.
Cheeso
Setara dengan IV dalam mode penghitung adalah nonce. Implementasi ini telah dirumuskan kembali menjadi lebih OO. Ini hanya mencakup mode operasi penghitung (CTR).
ChrisV
Ini bekerja dengan cukup baik, kecuali tidak ada mode ECB.
CpnCrunch
10

Posting ini sekarang sudah lama, tetapi crypto-js , mungkin sekarang adalah pustaka enkripsi javascript terlengkap.

CryptoJS adalah kumpulan algoritma kriptografi yang diimplementasikan dalam JavaScript. Ini mencakup kode sandi berikut: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop dan hasher: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 dengan 224, 256, 384, atau 512 bit.

Anda mungkin ingin melihat Panduan Memulai Cepat mereka yang juga merupakan referensi untuk port node.js berikut.

node-cryptojs-aes adalah port node.js dari crypto-js

marcz
sumber
1
Sayangnya dokumentasinya kurang. Tampaknya hanya memiliki panduan 'mulai cepat'. Dimana dokumentasi lengkapnya? Ia mengatakan itu mendukung beberapa panjang kunci, tetapi tidak ada dokumentasi tentang bagaimana melakukannya.
CpnCrunch
@CpnCrunch: dokumen API lengkap tidak online, tetapi kode sebagai komentar javadoc api lengkap. Dan Anda bisa membuatnya. Baca komentar di sumber cipher-core.js Anda akan menemukan ukuran kunci cipher dan ukuran IV cipher.
marcz
aneh, ketika saya mengenkripsi dan mendekripsi kembali, teksnya berbeda
OMGPOP
Ada beberapa konflik karena penggunaan openssl
Vlad
9

Baru-baru ini saya perlu melakukan beberapa interoperabilitas enkripsi / dekripsi antara javascript dan python.

Secara khusus...

1) Menggunakan AES untuk mengenkripsi dalam javascript dan mendekripsi dengan python (Google App Engine) 2) Menggunakan RSA untuk mengenkripsi dalam javascript dan mendekripsi dalam python (Google App Engine) 3) Menggunakan pycrypto

Saya menemukan banyak dan banyak versi RSA dan AES yang berbeda mengambang di web dan semuanya berbeda dalam pendekatannya, tetapi saya tidak menemukan contoh yang baik dari interoperabilitas javascript dan python ujung ke ujung.

Akhirnya saya berhasil menggabungkan sesuatu yang sesuai dengan kebutuhan saya setelah banyak percobaan dan kesalahan.

Bagaimanapun saya menemukan contoh js / webapp berbicara dengan server python yang dihosting mesin aplikasi google yang menggunakan AES dan kunci publik dan barang-barang RSA kunci pribadi.

Saya pikir saya akan memasukkannya di sini melalui tautan jika itu akan berguna bagi orang lain yang perlu mencapai hal yang sama.

http://www.ipowow.com/files/aesrsademo.tar.gz

dan lihat demo di rsa-aes-demo DOT appspot DOT com

edit: lihat output konsol browser dan juga lihat sumber untuk mendapatkan beberapa petunjuk dan pesan berguna tentang apa yang terjadi di demo

edit: tautan yang sangat lama dan tidak berfungsi yang diperbarui ke sumber sekarang mengarah ke

https://sestertii.com/files/aesrsademo.tar.gz

David Kierans
sumber
1
Terima kasih banyak untuk ini! Saya tidak bisa seumur hidup saya mendapatkan javascript aes saya untuk berbicara dengan python aes saya.
Lonjakan
1
Saya telah mencoba sepanjang malam (dengan pycrypto dan lainnya) untuk melakukan apa yang kode Anda bantu saya capai dalam 10 menit. Terima kasih banyak!
Remy Vanherweghem
1
Untuk alasan apapun saya membuat RSA bekerja dengan mudah tetapi AES adalah rasa sakit yang luar biasa. Terima kasih untuk ini!!!
speedplane
1
link ... tidak ditemukan!
machineaddict
7

Dilihat dari pengalaman saya sendiri, asmcrypto.js menyediakan implementasi AES tercepat di JavaScript (terutama di Firefox karena dapat memanfaatkan asm.js sepenuhnya di sana).

Dari readme:

Chrome/31.0
SHA256: 51 MiB/s (9 times faster than SJCL and CryptoJS)
AES-CBC: 47 MiB/s (13 times faster than CryptoJS and 20 times faster than SJCL)

Firefox/26.0
SHA256: 144 MiB/s (5 times faster than CryptoJS and 20 times faster than SJCL)
AES-CBC: 81 MiB/s (3 times faster than CryptoJS and 8 times faster than SJCL)

Edit: The Web Kriptografi API kini diterapkan di sebagian besar browser dan harus digunakan sebagai solusi utama jika Anda peduli tentang kinerja. Ketahuilah bahwa IE11 menerapkan versi draf sebelumnya dari standar yang tidak menggunakan promise.

Beberapa contoh dapat ditemukan di sini:

Joel Richard
sumber
Saya mendapatkan sekitar 8 MiB / dtk dengan CryptoJS. Bertanya-tanya bagaimana kinerjanya.
Lodewijk
3

Coba asmcrypto.js - ini sangat cepat.

PS: Saya seorang penulis dan saya bisa menjawab pertanyaan Anda jika ada. Saya juga akan senang mendapatkan umpan balik :)

vibornoff
sumber
asmcrypto.js bagus, tetapi di IE10 tidak berfungsi dengan baik. terkadang hang browser selama lebih dari 1 menit, atau setidaknya 45 detik. Plus, saya tidak mengerti, mengapa Anda perlu mengganti fungsi Matematika global? ada banyak perpustakaan yang menggunakan yang satu ini.
decho
2
Bisakah Anda mengomentari bagaimana Anda yakin itu berfungsi dengan baik? IOW: Bagaimana Anda tahu bahwa Anda menerapkan AES dengan benar?
Lodewijk
Kinerja IE10 buruk karena tidak mengoptimalkan asm.js sama sekali. Juga memiliki pola JIT yang sedikit berbeda. Membuat kode bekerja dengan baik di IE juga membuatnya menyedot Chrome dan FF. Misalkan saya punya pilihan yang benar. Mengenai Math.random ada diskusi panjang . Singkatnya, kebutuhan ini untuk pencegahan kebocoran keluaran Math.random mentah (yang secara teori dapat menurunkan keamanan PRNG).
vibornoff
1

Jika Anda mencoba menggunakan javascript untuk menghindari penggunaan SSL, pikirkan lagi. Ada banyak tindakan setengah jalan, tetapi hanya SSL yang menyediakan komunikasi yang aman. Perpustakaan enkripsi Javascript dapat membantu melawan serangkaian serangan tertentu, tetapi bukan serangan man-in-the-middle.

Jika Anda mencari SSL untuk mesin aplikasi google pada domain khusus, lihat wwwizer.com .

Posting berikut menjelaskan cara membuat upaya komunikasi aman dengan javascript dan cara membuatnya salah: Gunakan modul enkripsi JavaScript, bukan SSL / HTTPS

speedplane
sumber
1
Tidak yakin mengapa ini diturunkan untuk dilupakan, karena ini adalah poin yang sangat bagus bahwa siapa pun yang berpikir untuk menerapkan enkripsi javascript perlu setidaknya mempertimbangkannya. Suara positif.
Jules
Menggunakan kripto sisi klien untuk menghindari SSL adalah poin lama yang dikatakan beberapa orang untuk melawannya: sebenarnya itu dapat menambah keamanan ke HTTPS, menghindari serangan pasif, atau digunakan dalam aplikasi unduhan dan ekstensi browser. Saya hanya melihat sekali itu digunakan salah (kuliah saya, tetapi mereka sudah memperbaikinya) dan berkali-kali digunakan dengan benar (cryptocat, sebagai contoh).
Gustavo Rodrigues