5 Pertanyaan: Apakah ada opsi enkripsi asimetris untuk JavaScript?

pertanyaan dibuat di Tue, May 24, 2011 12:00 AM

Saya harus mentransfer beberapa informasi sensitif melalui Panggilan AJAX JavaScript, melalui saluran yang tidak dienkripsi (HTTP, bukan HTTPS).

Saya ingin mengenkripsi data, tetapi enkripsi di sisi JavaScript berarti saya mengekspos kuncinya, yang membuat enkripsi simetris hanya latihan keamanan karena ketidakjelasan.

Apakah ada enkripsi asimetris untuk JavaScript? Dengan begitu, saya bisa menjaga kerahasiaan kunci dekripsi Server. (Saya tidak khawatir tentang keamanan Server > pesan JavaScript, hanya tentang keamanan JavaScript > Pesan server tertentu)

    
22
5 Jawaban                              5                         

Alasan mengapa Anda membutuhkan enkripsi sama sekali adalah untuk melindungi dari seorang lelaki di tengah. Ada beberapa skenario di mana penyerang dapat mengendus lalu lintas tanpa bisa mengubahnya. Solusi ini akan melindungi dari ancaman itu, tetapi tidak akan memberikan perlindungan sama sekali terhadap orang yang mampu mengubah lalu lintas.

Jika penyerang dapat mengubah lalu lintas, maka ia juga akan dapat mengubah skrip yang melakukan enkripsi. Serangan paling mudah adalah dengan menghapus enkripsi sepenuhnya dari skrip. Jika Anda tidak memiliki https, dan man-in-the-middle dimungkinkan (yang merupakan kasus di hampir setiap skenario) maka Anda tidak memiliki kontrol sama sekali atas html atau javascript yang disajikan hingga akhir pengguna. Penyerang dapat menulis ulang kode html dan javascript Anda sepenuhnya, menonaktifkan enkripsi, membuat bidang formulir baru di formulir Anda, dll. Https adalah prasyarat untuk komunikasi yang aman di saluran web.

    
13
2011-05-25 07: 54: 36Z
  1. Setuju, enkripsi dalam JavaScript adalah ide yang buruk. Selain itu, saat ini tidak ada implementasi JavaScript di browser yang memiliki pembuatan angka acak yang aman. Ini berarti setiap kriptografi yang diimplementasikan dalam JavaScript akan rusak , apa pun ancaman lainnya.
    2011-05-25 09: 37: 59Z
  2. Terima kasih. Itu masuk akal - saya terutama mempertimbangkan mengendus, bukan manipulasi. Saya akan memikirkan ini lagi dan melihat apakah HTTPS entah bagaimana merupakan pilihan.
    2011-05-25 15: 42: 34Z
  3. Sebenarnya, kecuali jika diterapkan dengan sungguh-sungguh benar-benar , hanya melakukan enkripsi asimetris yang normal juga tidak melindungi terhadap penyadapan. Biasanya Anda mengenkripsi kunci simetris dengan kunci RSA, kemudian melakukan enkripsi dengan kunci sesi simetris. Enkripsi itu terikat untuk menggunakan CBC dengan semacam padding. Karena layanan yang menangani pos online, Anda sekarang telah membuat skema yang rentan terhadap serangan padding oracle (bukankah kriptografi menyenangkan?).
    2011-05-26 11: 30: 57Z
  4. @ sstendal: Bagaimana jika koneksi https. Lalu bisakah saya menggunakan enkripsi dalam javascript? Saya perlu melakukan enkripsi kunci publik. Bidang formulir pengguna ditandatangani oleh kunci pribadinya di sisi klien (klien harus memberikan lokasi keystore yang berisi kunci privat). Dan dikirim ke server. Server di sana memverifikasi bahwa pengguna yang tepat telah menandatangani dengan memverifikasi tanda tangan menggunakan kunci publik yang sesuai. Tapi saya rasa itu tidak mungkin. Karena javascript adalah sandbox. Anda tidak dapat mengakses file host lokal, saya kira. Harap perbaiki saya JIKA saya bekerja. Apakah ada cara untuk mengetahui hal ini?
    2012-05-03 09: 50: 34Z

Saya sudah melakukannya. Saya menggunakan enkripsi RSA asimetri sisi klien JavaScript ini untuk mencegah kredensial masuk dikirim dalam bentuk teks biasa melalui HTTP.

Tujuannya adalah untuk mencegah serangan replay dari permintaan loginjaringan mengendus. Tentu saja, ini tidak seaman HTTPS karena tidak akan tahan terhadap serangan man-in-the-middle, tetapi bisa mencukupi untuk jaringan lokal.

Enkripsi sisi klien menggunakan karya hebat Travis Tridwell yang didasarkan pada JSBN . Halaman web Travis juga dapat menghasilkan kunci RSA pribadi dan publik (jika Anda terlalu malas untuk menggunakan openssl). Kunci dibuat dalam format PEM # PKCS # 1. Saya mengenkripsi username+password+timeInMs+timezone sehingga konten yang dienkripsi berubah pada setiap login.

Di sisi server, pembacaan kode Java saya membaca file PEM # PKCS # 1 menggunakan org.apache.jmeter.protocol.oauth.sampler.PrivateKeyReader Apache JMeter :

 
PrivateKey pk = (new PrivateKeyReader("myPrivateKeyFile.pem")).getPrivateKey();

Lalu saya mendekripsi konten terenkripsi menggunakan

 
byte[] enc = DatatypeConverter.parseBase64Binary(clientData);
Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.DECRYPT_MODE, pk);
byte[] dec = rsa.doFinal(enc);
String out = new String(dec, "UTF8");

Lalu saya memeriksa apakah timestamp /zona waktu sisi klien cocok dengan timestamp /zona waktu sisi-server. Jika penundaan kurang dari beberapa detik, proses login berlanjut. Kalau tidak, permintaan dianggap serangan replay dan login gagal.

    
8
2014-02-03 15: 24: 18Z

Pertanyaan ini tampaknya sesuai dengan yang Anda cari, Pustaka kriptografi Javascript untuk menandatangani data formulir di browser Tautan PGP: http: //www.hanewin. net /mengenkripsi / memiliki RSA

    
3
2017-05-23 11: 54: 34Z

Apakah Server > Pesan JavaScript dikirim melalui HTTPS?

Jika tidak, tidak ada yang mencegah seorang pria di tengah mengubah skrip. Enkripsi apa pun tidak akan berguna jika kode yang memiliki akses ke data yang tidak dienkripsi terganggu.

    
3
2011-05-24 21: 23: 17Z
  1. Pertanyaan saya mengatakan bahwa itu HTTP, bukan HTTPS. Itu sebabnya saya melihat enkripsi asimetris, sehingga saya dapat menyimpan kunci dekripsi di sisi server. Itulah tepatnya yang membantu memecahkan masalah enkripsi asimetris: Seorang lelaki di tengah dapat memperoleh pesan yang dienkripsi, kunci yang digunakan untuk mengenkripsi pesan itu, tetapi tanpa kunci untuk mendekripsinya, itu tidak terlalu baik.
    2011-05-24 22: 19: 45Z
  2. Seorang pria yang berada di tengah serangan juga dapat mengubah kunci publik. Anda juga memerlukan beberapa bentuk otentikasi, yang agak sulit dilakukan dari perspektif skrip yang berjalan di jendela browser.
    2011-05-24 23: 16: 58Z
  3. @ Erik: Tentu saja kunci publik asimetris. Dan Anda benar, jika penyerang dapat mengubah kunci publik, ia juga dapat mengubah kode pada halaman. Jadi skema ini hanya melindungi terhadap penyadapan. Selama Michael sadar bahwa skema ini tidak melindungi terhadap MITM.
    2011-05-25 20: 47: 03Z
  4. @ owl perhatikan baik-baik; Anda mengatakan kunci pubis.
    2011-05-25 21: 38: 17Z
  5. @ owl Saya sepenuhnya mengerti kriptografi kunci publik /pribadi. :) Silakan klik tautan ini dan baca definisi pubic .
    2011-05-26 16: 08: 13Z

kunci publik /kunci pribadi asimetris adalah satu-satunya cara untuk melakukan ini. Untuk melindungi terhadap serangan MIM, server dapat meng hash kunci publik dengan kata sandi pengguna, lalu pengguna (di browser) menghitung ulang hash - jika cocok, maka pengguna dapat yakin bahwa kunci publik yang dikirim dari server belum telah dirusak - ini bergantung pada fakta bahwa hanya server dan pengguna yang tahu kata sandi pengguna.

PS Saya ingin menulis ini sebagai komentar karena itu akan lebih tepat daripada jawaban, tapi saya tidak punya cukup poin :)

    
3
2014-05-16 16: 37: 16Z
  1. Apakah Anda punya sumber bagaimana melakukannya dengan kunci publik /kunci pribadi?
    2018-04-20 12: 39: 26Z
  2. 2019-05-18 19: 11: 07Z
sumber ditempatkan sini