Đối với số lượng lớn dữ liệu, bạn cần sử dụng /dev/urandom
. Các u
là "không giới hạn", nghĩa là sẽ luôn có sẵn dữ liệu. Nếu bạn cố đọc nhiều dữ liệu từ /dev/random
, nó sẽ chặn, ngăn chương trình của bạn tiếp tục trong một thời gian.
Cả hai /dev/random
và /dev/urandom
cung cấp dữ liệu không thể đoán trước (ngẫu nhiên). Dữ liệu từ /dev/random
dự định là hoàn toàn không thể đoán trước (hoặc thực sự ngẫu nhiên ), làm cho nó phù hợp với những thứ như khóa mật mã dài hạn (nơi kẻ tấn công trong tương lai có thể có lợi thế của nghiên cứu sâu rộng và máy tính nhanh hơn nhiều để thử và phá vỡ thuật toán được sử dụng để tạo dữ liệu). Dữ liệu từ /dev/urandom
được dựa trên dữ liệu thực sự ngẫu nhiên, nhưng có thể được chạy qua chất lượng cao giả ngẫu nhiên chức năng sản xuất dữ liệu bổ sung. Nó vẫn phù hợp với những thứ như khóa mã hóa, miễn là bạn không cần chắc chắn rằng chúng sẽ không bị hỏng trong nhiều thập kỷ, nhưng cũng có thể được sử dụng cho dữ liệu hàng loạt.
Nhân Linux duy trì một "nhóm entropy" dữ liệu không thể đoán trước, trong đó mỗi bit có cơ hội bằng nhau là đúng hoặc sai (một hoặc không). Hạt nhân xây dựng nhóm entropy này từ nhiều đầu vào khác nhau, chẳng hạn như nguồn phần cứng, trình điều khiển, hành động của người dùng và bất kỳ thứ gì khác không thể dự đoán một cách đáng tin cậy. Tuy nhiên, các nguồn này cần có thời gian để tích lũy entropy, do đó, entropy pool có thể bị cạn kiệt nếu nó được tiêu thụ quá nhanh.
/dev/random
rút trực tiếp từ hồ bơi entropy. Khi hồ cạn kiệt, đọc từ /dev/random
không trả lại bất kỳ dữ liệu nào nữa cho đến khi nhóm đã nạp đầy đủ, có thể mất khá nhiều thời gian. /dev/urandom
sử dụng một trình tạo số giả ngẫu nhiên an toàn bằng mật mã (CSPRNG) được gieo hạt từ bể entropy. Nó có thể tạo ra một lượng đầu ra vô hạn, nhưng đầu ra không thể dự đoán được mà không biết trạng thái bên trong của CSPRNG. Bởi vì trạng thái bên trong ban đầu dựa trên dữ liệu thực sự ngẫu nhiên và thuật toán CSPRNG được sử dụng được thiết kế để không rò rỉ trạng thái bên trong thông qua đầu ra của nó, /dev/urandom
vẫn là một nguồn tốt của dữ liệu rất ngẫu nhiên.
Tóm lại, khi bạn cần tối đa dữ liệu ngẫu nhiên, sử dụng /dev/random
. Tuy nhiên, nếu bạn cần nhiều dữ liệu, bạn cần sử dụng /dev/urandom
. Nói chung, sử dụng /dev/urandom
trừ khi bạn cần dữ liệu không thể phân biệt được với tiếng ồn thực sự ngẫu nhiên trong nhiều thập kỷ tới.