Baik OpenJDK dan Sun membaca dari /dev/urandom
, bukan /dev/random
, setidaknya pada mesin tempat saya menguji (OpenJDK JRE 6b27 dan Sun JRE 6.26 di Debian squeeze amd64). Untuk beberapa alasan, keduanya membuka /dev/random
juga tapi tidak pernah membacanya. Jadi artikel blog yang Anda baca salah atau diterapkan ke versi yang berbeda dari saya (dan, tampaknya, milik Anda).
Anda dapat memeriksa apakah milik Anda membaca dari /dev/random
atau /dev/urandom
dengan menelusurinya:
strace -o a.strace -f -e file java A
dan cari bagian pelacakan yang relevan:
21165 open("/dev/random", O_RDONLY) = 6
…
21165 open("/dev/urandom", O_RDONLY) = 7
…
21165 read(7, "\322\223\211\262Zs\300\345\3264l\254\354[\6wS\[email protected]", 20) = 20
…
Jangan khawatir, /dev/urandom
sangat baik untuk kriptografi.
SecureRandom Java bisa gunakan /dev/random, tetapi hanya sebentar.
Khususnya hanya menggunakannya saat menghasilkan informasi benih, baik dengan memanggil SecureRandom.generateSeed()
secara eksplisit atau dengan panggilan pertama ke nextInt()
Jadi karena itu, untuk mengulangi contoh bash Anda, Anda dapat melakukan hal berikut, dan itu harus diblokir.
import java.security.SecureRandom;
public class A {
public static void main(String[] args) {
SecureRandom sr;
int out = 0;
for (int i = 0; i < 1<<20 ; i++) {
sr = new SecureRandom();
out ^= sr.nextInt();
}
System.out.println(out);
}
}
Bukan hanya untuk menjaga utas lama tetap hidup tetapi beberapa orang mungkin telah melewatkan bagian penting dari cerita panjang di balik ini ... Ini tentang bug yang terkenal dan persisten saat menggunakan /dev/urandom dari Java versi 1.4 ke versi 1.7. Lihat tautan di bawah ini :
http://bugs.java.com/view_bug.do?bug_id=6202721
http://bugs.java.com/view_bug.do?bug_id=4705093
Yang saya tahu, ini akhirnya ditangani di Java 8 seperti yang dinyatakan oleh Oracle :https://docs.Oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html
SHA1PRNG dan NativePRNG diperbaiki agar sesuai dengan properti sumber seedSecureRandom dengan benar di file java.security. (Solusi yang tidak jelas menggunakan file:///dev/urandom dan file:/dev/./urando tidak lagi diperlukan.)