2014-12-24 10 views
6

Tôi hơi bối rối về việc sử dụng SecureRandom. Tôi cần tạo các số nan toàn số ngẫu nhiên trong một vòng lặp. Có an toàn khi sử dụng cùng một cá thể SecureRandom cho mỗi thế hệ không? Có bất kỳ sự khác biệt nào giữa các giải pháp dưới đây về sức mạnh mã hóa không?Sử dụng lặp lại của SecureRandom của Java

1) Ví dụ đơn mà không gieo hạt

2) Ví dụ mới cho mỗi thế hệ

for(int i = 0; i < n; ++i) new SecureRandom().nextInt(); 

3) Ví dụ đơn với seeding

SecureRandom sr = new SecureRandom() 
for(int i = 0; i < n; ++i) { 
    byte[] seed = sr.generateSeed(32); 
    sr.setSeed(seed); 
    sr.nextInt(); 
} 
+1

* "Tôi cần tạo n số ngẫu nhiên trong một vòng lặp" * - câu hỏi đầu tiên là, bạn có cần số ngẫu nhiên hay số an toàn ngẫu nhiên không. Nếu trước đây, bạn không cần 'SecureRandom'. Bạn có thể sử dụng [Trình tạo đồng phân tuyến tính] (http://en.wikipedia.org/wiki/Linear_congruential_generator). một LCG sẽ thích hợp cho các mô phỏng, nơi bạn cần các con số nhanh chóng từ một bản phân phối đồng đều. – jww

Trả lời

9

lẽ phản trực giác thứ ba gần như chắc chắn là yếu nhất, khả năng lặp lại lặp lại vòng lặp là một ý tưởng khủng khiếp. Thứ hai là xấu, nhưng ít xấu, vì SecureRandom() bao gồm chiến lược seed mặc định mạnh mẽ. Như được hỏi, đầu tiên gần như chắc chắn là an toàn nhất vì nó tối đa hóa thời kỳ entropic. Tôi đề nghị bạn trích xuất nó đến một hằng số cấp lớp vì lý do đó.

private static final Random RANDOM = new SecureRandom(); 
// ... 
// your method, 
for (int i = 0; i < n; ++i) { 
    int num = RANDOM.nextInt(); 
} 
+2

* "Có lẽ phản trực giác thứ ba gần như chắc chắn là yếu nhất, việc chèn lại vòng lặp lặp lại là một ý tưởng khủng khiếp ..." * - có một vài giấy tờ có thể không đồng ý với bạn. Các giấy tờ đề nghị chèn lại máy phát điện dụ trước khi máy phát điện được yêu cầu để sản xuất bit. – jww

+0

* "thứ hai là xấu, nhưng ít xấu, bởi vì SecureRandom() bao gồm một chiến lược hạt giống mặc định mạnh mẽ" * - bằng chứng bằng ví dụ truy cập: [Android SecureRandom] (http://android-developers.blogspot.com/2013/08 /some-securerandom-thoughts.html). Luôn luôn gieo hạt máy phát điện trước khi sử dụng nó. Đừng dựa vào người khác. – jww

+0

@ jww Tôi duy trì nó vẫn còn ít xấu sau đó tùy chọn 3. –

2

tôi đề nghị bạn nên đọc này thú vị article

Nói chung, không có nhu cầu để tạo ra nhiều trường hợp của SecureRandom(), như @ElliottFrisch tuyên bố một static final sự là giải pháp thích hợp nhất. Tuy nhiên, nếu bạn sử dụng SecureRandom cho một chuỗi các kết quả đầu ra ngẫu nhiên, bạn nên định kỳ reseed nó để không cho phép phần mềm độc hại xác định hạt giống và do đó dự đoán tất cả các kết quả đầu ra trong tương lai.

Các vấn đề liên quan