Việc triển khai hiện tại SecureRandom
là an toàn theo luồng, đặc biệt là hai phương pháp đột biến nextBytes(bytes[])
và setSeed(byte[])
được đồng bộ hóa.
Chà, theo như tôi có thể nói, tất cả các phương thức đột biến cuối cùng đều được định tuyến thông qua hai phương thức đó và SecureRandom
ghi đè một vài phương thức Random
để đảm bảo điều đó. Phương pháp này hoạt động nhưng có thể bị hỏng nếu việc triển khai bị thay đổi trong tương lai.
Giải pháp tốt nhất là đồng bộ hóa thủ công trên SecureRandom
phiên bản đầu tiên. Điều này có nghĩa là mỗi ngăn xếp cuộc gọi sẽ thu được hai khóa trên cùng một đối tượng, nhưng điều đó thường rất rẻ trên các JVM hiện đại. Có nghĩa là, không có nhiều tác hại trong việc đồng bộ hóa rõ ràng bản thân. Ví dụ:
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}