Làm thế nào để tạo một mảng 20 byte ngẫu nhiên?


Câu trả lời:



46

Nếu bạn muốn một trình tạo số ngẫu nhiên mạnh về mật mã (cũng an toàn cho chuỗi) mà không cần sử dụng API của bên thứ ba, bạn có thể sử dụng SecureRandom.

Java 6 & 7:

SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);

Java 8 (thậm chí an toàn hơn):

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);

16

Nếu bạn đã sử dụng Apache Commons Lang, thì RandomUtils đây là một lớp lót:

byte[] randomBytes = RandomUtils.nextBytes(20);

8
Sau khi thực hiện một số hoạt động đào, RandomUtils sử dụng Math.random () trong phần mềm, không phải SecureRandom. Chỉ muốn làm cho điều này rõ ràng.
Evo510

Phương pháp này không còn tồn tại nữa.
Martijn Hiemstra


@DuncanJones Tôi đang sử dụng Spring boot 2 sử dụng Commons lang 3.7 và nó đã bị xóa. Xem mã nguồn cho thấy rằng nó đã được nhận xét. Vì vậy, tôi sẽ không tin mã này vì bản nâng cấp có thể khiến mã của bạn không thể hoàn thành.
Martijn Hiemstra

8

Java 7 đã giới thiệu ThreadLocalRandom được phân lập cho luồng hiện tại .

Đây là một biểu hiện khác của giải pháp maerics .

final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);

1
Có lẽ một số dấu ngoặc đơn quá nhiều sau từ ThreadLocalRandom? Tốt hơn:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt

4

Tạo một đối tượng Ngẫu nhiên với một hạt giống và lấy mảng ngẫu nhiên bằng cách thực hiện:

public static final int ARRAY_LENGTH = 20;

byte[] byteArray = new byte[ARRAY_LENGTH];
new Random(System.currentTimeMillis()).nextBytes(byteArray);
// get fisrt element
System.out.println("Random byte: " + byteArray[0]);

0

Đối với những người muốn một cách an toàn hơn để tạo một mảng byte ngẫu nhiên, có, cách an toàn nhất là:

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);

NHƯNG chủ đề của bạn có thể chặn nếu không có đủ ngẫu nhiên có sẵn trên máy, tùy thuộc vào hệ điều hành của bạn. Các giải pháp sau đây sẽ không chặn:

SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);

Điều này là do ví dụ đầu tiên sử dụng /dev/randomvà sẽ chặn trong khi chờ thêm tính ngẫu nhiên (được tạo bởi chuột / bàn phím và các nguồn khác). Ví dụ thứ hai sử dụng /dev/urandomsẽ không chặn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.