Cả hai /dev/random
và /dev/urandom
sử dụng một "hồ bơi entropy". Khi pool hết, /dev/random
chờ cho nó nạp đầy, yêu cầu giám sát hành vi của hệ thống (nhập bàn phím, di chuyển chuột, v.v.), trong khi đó /dev/urandom
sẽ tiếp tục cung cấp cho bạn dữ liệu giả ngẫu nhiên. /dev/random
về mặt lý thuyết là chất lượng cao hơn, nhưng /dev/urandom
gần như chắc chắn đủ tốt cho mục đích của bạn. (Nhưng thậm chí /dev/urandom
có khả năng chậm hơn một số phương pháp khác. Máy phát nhanh hơn, nhưng chất lượng thấp hơn có thể đủ tốt để xóa ổ đĩa cứng. các số ngẫu nhiên này tốt hơn cho mục đích này hơn là một chuỗi như 0, 1, 2, 3, 4, ....)
Trích dẫn random(4)
trang người đàn ông:
Nếu bạn không chắc chắn về việc bạn nên sử dụng /dev/random
hay
/dev/urandom
, thì có lẽ bạn muốn sử dụng cái sau. Theo nguyên tắc chung, /dev/urandom
nên được sử dụng cho tất cả mọi thứ trừ các khóa GPG / SSL / SSH tồn tại lâu dài.
CẬP NHẬT : Trang man `ngẫu nhiên (4) đã được cập nhật kể từ khi tôi viết nó. Bây giờ nó nói:
Các /dev/random
giao diện được coi là một giao diện cũ, và
/dev/urandom
được ưa thích và đủ trong mọi trường hợp sử dụng, ngoại trừ các ứng dụng đòi hỏi tính ngẫu nhiên trong thời gian khởi động sớm; đối với các ứng dụng này, getrandom(2)
phải được sử dụng thay thế, bởi vì nó sẽ chặn cho đến khi nhóm entropy được khởi tạo.
Xem thêm " Huyền thoại về / dev / urandom " của Thomas Hühn.
Nhưng /dev/urandom
, mặc dù nó sẽ không chặn, có thể sẽ quá chậm nếu bạn muốn tạo ra lượng dữ liệu khổng lồ. Thực hiện một số phép đo trên hệ thống của bạn trước khi thử nó.
EDIT: Dưới đây là một sự lạc quan về các số ngẫu nhiên "thật" so với các số giả ngẫu nhiên. Nếu tất cả những gì bạn quan tâm là một câu trả lời thiết thực cho câu hỏi, bạn có thể ngừng đọc ngay bây giờ.
Tôi dường như đã tuyên bố (bao gồm cả trong các câu trả lời khác ở đây) /dev/random
thực hiện trình tạo số ngẫu nhiên "thật", trái ngược với trình tạo số giả ngẫu nhiên (PRNG). Ví dụ, bài viết Wikipedia đưa ra yêu cầu như vậy. Tôi không tin đó là chính xác. Có một số thảo luận về nó ở đây đề cập đến các trình tạo số ngẫu nhiên phần cứng, nhưng tôi không thấy bằng chứng nào /dev/random
thường sử dụng một thiết bị như vậy, hoặc các máy tính thông thường thậm chí có một thiết bị như vậy. Chúng khác với các PRNG như rand()
hàm C ở chỗ chúng không mang tính quyết định, vì chúng thu hoạch entropy từ các nguồn thực tế không thể đoán trước.
Tôi muốn nói có ba loại trình tạo số "ngẫu nhiên":
Các PRNG xác định, như rand()
hàm C , sử dụng thuật toán để tạo các chuỗi lặp lại có (ít nhiều) các thuộc tính thống kê của chuỗi thực sự ngẫu nhiên. Chúng có thể đủ tốt cho các trò chơi (được cung cấp một cách tốt để gieo chúng) và cần thiết cho các ứng dụng yêu cầu độ lặp lại, nhưng chúng không phù hợp với mật mã.
Các máy phát điện thích /dev/random
và /dev/urandom
thu thập entropy từ một số nguồn thực tế không thể đoán trước như hoạt động I / O (đây là lý do tại sao đập bàn phím hoặc di chuyển chuột có thể gây /dev/random
ra nhiều dữ liệu hơn). Tôi không rõ liệu những điều này có thỏa mãn định nghĩa về PRNG hay không (tôi đã thấy các định nghĩa nói rằng PRNG là xác định), nhưng chúng không phải là các trình tạo số ngẫu nhiên thực sự .
Các bộ tạo số ngẫu nhiên phần cứng không thể đoán trước được về mặt vật lý ngay cả khi có kiến thức đầy đủ về trạng thái ban đầu của chúng và sử dụng thêm các kỹ thuật toán học để đảm bảo các thuộc tính thống kê phù hợp.