Theo tài liệu này , các thuật toán khác nhau được SecureRandom sử dụng theo thứ tự ưu tiên:
- Trên hầu hết các hệ thống * NIX
- Bản địa
- SHA1PRNG
- Khóa bản địa
- NativePRNGNonBlocking
- Trên các hệ thống Windows
- SHA1PRNG
- Windows-PRNG
Vì bạn đã hỏi về Linux, tôi bỏ qua việc triển khai Windows và cả SunPKCS11 chỉ thực sự có sẵn trên Solaris, trừ khi bạn tự cài đặt nó - và sau đó bạn sẽ không hỏi điều này.
Theo những tài liệu tương tự, những thuật toán này sử dụng là gì
SHA1PRNG
Việc gieo hạt ban đầu hiện được thực hiện thông qua sự kết hợp của các thuộc tính hệ thống và thiết bị thu thập entropy java.security.
NativePRNG
nextBytes()
sử dụng /dev/urandom
generateSeed()
sử dụng/dev/random
NativePRNGBlocking
nextBytes()
và generateSeed()
sử dụng/dev/random
NativePRNGNonBlocking
nextBytes()
và generateSeed()
sử dụng/dev/urandom
Điều đó có nghĩa là nếu bạn sử dụng SecureRandom random = new SecureRandom()
, nó sẽ đi xuống danh sách đó cho đến khi nó tìm thấy một hoạt động, thường sẽ là NativePRNG. Và điều đó có nghĩa là nó tự tạo hạt giống từ /dev/random
(hoặc sử dụng nó nếu bạn tạo rõ ràng một hạt giống), sau đó sử dụng /dev/urandom
để nhận các byte, ints, double, booleans, what-have-yous tiếp theo.
Vì /dev/random
là chặn (nó chặn cho đến khi nó có đủ entropy trong nhóm entropy), điều đó có thể cản trở hiệu suất.
Một giải pháp cho điều đó là sử dụng một cái gì đó như đã tạo ra đủ entropy, một giải pháp khác là sử dụng /dev/urandom
thay thế. Mặc dù bạn có thể thiết lập điều đó cho toàn bộ jvm, một giải pháp tốt hơn là thực hiện nó cho trường hợp cụ thể này SecureRandom
bằng cách sử dụng SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking")
. Lưu ý rằng phương thức đó có thể ném NoSuchAlerskymException nếu NativePRNGNonBlocking, vì vậy hãy chuẩn bị để dự phòng về mặc định.
SecureRandom random;
try {
random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
random = new SecureRandom();
}
Cũng lưu ý rằng trên các hệ thống * nix khác, /dev/urandom
có thể hoạt động khác đi .
Là /dev/urandom
đủ ngẫu nhiên?
Sự khôn ngoan thông thường có nó là chỉ /dev/random
đủ ngẫu nhiên. Tuy nhiên, một số tiếng nói khác nhau. Trong "Cách đúng để sử dụng SecureRandom" và "Huyền thoại về / dev / urandom" , người ta cho rằng điều đó /dev/urandom/
cũng tốt như vậy.
Người dùng trên ngăn xếp Bảo mật thông tin đồng ý với điều đó . Về cơ bản, nếu bạn phải hỏi, /dev/urandom
tốt cho mục đích của bạn.