Menurut dokumentasi , berbagai algoritme yang digunakan oleh SecureRandom adalah, sesuai urutan preferensi:
- Pada kebanyakan * sistem NIX
- NativePRNG
- SHA1PRNG
- NativePRNGBlocking
- NativePRNGNonBlocking
- Pada sistem Windows
- SHA1PRNG
- Windows-PRNG
Karena Anda bertanya tentang Linux, saya mengabaikan implementasi Windows, dan juga SunPKCS11 yang hanya benar-benar tersedia di Solaris, kecuali Anda menginstalnya sendiri - dan Anda tidak akan menanyakan hal ini.
Menurut dokumentasi yang sama, apa yang digunakan algoritma ini
SHA1PRNG
Penyemaian awal saat ini dilakukan melalui kombinasi atribut sistem dan perangkat pengumpulan entropi java.security.
NativePRNG
nextBytes()
menggunakan /dev/urandom
generateSeed()
kegunaan/dev/random
NativePRNGB mengunci
nextBytes()
dan generateSeed()
menggunakan/dev/random
NativePRNGNonBlocking
nextBytes()
dan generateSeed()
gunakan/dev/urandom
Itu berarti jika Anda menggunakan SecureRandom random = new SecureRandom()
, itu turun daftar itu sampai menemukan yang berfungsi, yang biasanya NativePRNG. Dan itu berarti bahwa itu berasal dari /dev/random
(atau menggunakannya jika Anda secara eksplisit menghasilkan benih), lalu gunakan/dev/urandom
untuk mendapatkan byte, int, dobel, boolean berikutnya, apa-yang-Anda-miliki.
Sejak /dev/random
memblokir (itu memblokir sampai memiliki cukup entropi di kumpulan entropi), yang dapat menghambat kinerja.
Salah satu solusi untuk itu adalah menggunakan sesuatu seperti ditempa untuk menghasilkan entropi yang cukup, solusi lain menggunakan /dev/urandom
sebagai gantinya. Meskipun Anda bisa mengaturnya untuk seluruh jvm, solusi yang lebih baik adalah melakukannya untuk instance khusus ini SecureRandom
, dengan menggunakan SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking")
. Perhatikan bahwa metode itu dapat melempar NoSuchAlgorithmException jika NativePRNGNonBlocking, jadi bersiaplah untuk mundur ke default.
SecureRandom random;
try {
random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
random = new SecureRandom();
}
Perhatikan juga bahwa pada sistem * nix lain, /dev/urandom
mungkin berperilaku berbeda .
Apakah /dev/urandom
cukup acak?
Kebijaksanaan konvensional mengatakan bahwa hanya /dev/random
cukup acak. Namun, beberapa suara berbeda. Dalam "Cara yang Tepat untuk Menggunakan SecureRandom" dan "Mitos tentang / dev / urandom" , dikatakan bahwa /dev/urandom/
itu sama baiknya.
Para pengguna di tumpukan Keamanan Informasi setuju dengan itu . Pada dasarnya, jika Anda harus bertanya, /dev/urandom
boleh saja untuk tujuan Anda.