Saya memiliki aplikasi yang menggunakan enkripsi AES 256-bit yang tidak didukung oleh Java di luar kotak. Saya tahu untuk mendapatkan ini berfungsi dengan benar, saya menginstal stoples kekuatan tidak terbatas JCE di folder keamanan. Ini bagus untuk saya sebagai pengembang, saya dapat menginstalnya.
Pertanyaan saya adalah karena aplikasi ini akan didistribusikan, pengguna akhir kemungkinan besar tidak akan menginstal file kebijakan ini. Memiliki pengguna akhir mengunduh ini hanya untuk membuat fungsi aplikasi bukan solusi yang menarik.
Apakah ada cara untuk membuat aplikasi saya berjalan tanpa menimpa file pada mesin pengguna akhir? Perangkat lunak pihak ketiga yang dapat menanganinya tanpa menginstal file kebijakan? Atau cara hanya merujuk file kebijakan ini dari dalam JAR?
sumber
Jawaban:
Ada beberapa solusi yang biasa dikutip untuk masalah ini. Sayangnya, keduanya tidak sepenuhnya memuaskan:
Tapi kemudian ada refleksi. Adakah yang tidak bisa Anda lakukan menggunakan refleksi?
Cukup panggil
removeCryptographyRestrictions()
dari penginisialisasi statis atau semacamnya sebelum melakukan operasi kriptografis apa pun.Bagian
JceSecurity.isRestricted = false
inilah yang diperlukan untuk menggunakan sandi 256-bit secara langsung; Namun, tanpa dua operasi lainnya,Cipher.getMaxAllowedKeyLength()
masih akan tetap melaporkan 128, dan 256-bit TLS cipher suites tidak akan berfungsi.Kode ini berfungsi pada Oracle Java 7 dan 8, dan secara otomatis melewatkan proses pada Java 9 dan OpenJDK di tempat yang tidak diperlukan. Bagaimanapun, menjadi peretasan yang buruk, sepertinya tidak bekerja pada VM vendor lain.
Ini juga tidak berfungsi pada Oracle Java 6, karena kelas-kelas JCE pribadi dikaburkan di sana. Kebingungan tidak berubah dari versi ke versi, jadi masih memungkinkan secara teknis untuk mendukung Java 6.
sumber
final
bidang di 8u111, saya memodifikasinya sehingga dapat mengubah bidang terakhir, mengikuti jawaban ini . Hasilnya hampir sama dengan versi baru ntoskrnl, kecuali saya tidak menyatakannyamodifiersField
sebagaifinal
. Salah satu pengguna saya melaporkan bahwa ia berfungsi di 8u112 juga.Ini sekarang tidak lagi diperlukan untuk Java 9 , juga untuk rilis Java 6, 7, atau 8. Terakhir! Akhirnya! :)
Per JDK-8170157 , kebijakan kriptografi tak terbatas sekarang diaktifkan secara default.
Versi spesifik dari masalah JIRA:
Perhatikan bahwa jika karena alasan aneh perilaku lama diperlukan di Java 9, itu dapat diatur menggunakan:
sumber
Berikut ini solusinya: http://middlesphere-1.blogspot.ru/2014/06/ini-code-allows-to-break-limit-if.html
sumber
java.security.InvalidKeyException: Wrong algorithm: AES or Rijndael required
isRestricted
bidang telah menjadi final ( bugs.openjdk.java.net/browse/JDK-8149417 ). @ ntoskrnl menjawab mengurus kemungkinan penyertaan pengubah "final". Komentar @ M.Dudley tentang Perjanjian Lisensi Java masih berlaku juga.Bouncy Castle masih membutuhkan stoples yang dipasang sejauh yang saya tahu.
Saya melakukan tes kecil dan sepertinya mengkonfirmasi ini:
http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions
sumber
Pada JDK 8u102, solusi yang diposting mengandalkan refleksi tidak akan lagi berfungsi: bidang yang ditetapkan solusi ini sekarang
final
( https://bugs.openjdk.java.net/browse/JDK-8149417 ).Sepertinya itu kembali ke (a) menggunakan Bouncy Castle, atau (b) menginstal file kebijakan JCE.
sumber
isRestricted
bidang ini, karena menangani kemungkinan penambahan pengubah "final".Untuk pustaka kriptografi alternatif, lihat Bouncy Castle . Ini memiliki AES dan banyak fungsi tambahan. Ini perpustakaan open source liberal. Anda harus menggunakan API Castle Bouncy yang ringan dan eksklusif agar ini berfungsi.
sumber
Anda bisa menggunakan metode
untuk menguji panjang kunci yang tersedia, gunakan itu dan beri tahu pengguna tentang apa yang sedang terjadi. Sesuatu yang menyatakan bahwa aplikasi Anda kembali ke kunci 128 bit karena file kebijakan tidak diinstal, misalnya. Pengguna yang sadar akan keamanan akan menginstal file kebijakan, yang lain akan terus menggunakan kunci yang lebih lemah.
sumber
Untuk aplikasi kami, kami memiliki arsitektur server klien dan kami hanya membolehkan mendekripsi / mengenkripsi data di tingkat server. Karenanya file JCE hanya diperlukan di sana.
Kami memiliki masalah lain di mana kami perlu memperbarui toples keamanan pada mesin klien, melalui JNLP, itu menimpa perpustakaan di
${java.home}/lib/security/
dan JVM saat dijalankan pertama kali.Itu membuatnya bekerja.
sumber
Inilah versi terbaru dari jawaban ntoskrnl . Ini juga berisi fungsi untuk menghapus pengubah akhir seperti Arjan yang disebutkan dalam komentar.
Versi ini berfungsi dengan JRE 8u111 atau lebih baru.
sumber
((Map<?, ?>) perms.get(defaultPolicy)).clear();
menghasilkan kesalahan kompiler. Mengomentari sepertinya tidak memengaruhi fungsinya. Apakah garis ini perlu?Berikut ini adalah versi modifikasi dari kode @ ntoskrnl yang menampilkan
isRestrictedCryptography
check by aktualCipher.getMaxAllowedKeyLength
, slf4j logging, dan dukungan inisialisasi singleton dari aplikasi bootstrap seperti ini:Kode ini akan berhenti mangling dengan refleksi ketika kebijakan tak terbatas tersedia secara default di Java 8u162 seperti diprediksi oleh jawaban @ cranphin.
sumber
Selama instalasi program Anda, hanya meminta pengguna dan memiliki skrip DOS Batch atau skrip Bash shell unduh dan salin JCE ke lokasi sistem yang tepat.
Saya dulu harus melakukan ini untuk layanan server web dan bukannya installer resmi, saya hanya menyediakan skrip untuk mengatur aplikasi sebelum pengguna bisa menjalankannya. Anda dapat membuat aplikasi tidak dapat dijalankan hingga mereka menjalankan skrip pengaturan. Anda juga bisa membuat aplikasi mengeluh bahwa JCE hilang dan kemudian meminta untuk mengunduh dan memulai ulang aplikasi?
sumber