Tôi có nên sử dụng những người khác có thể sử dụng dữ liệu ngẫu nhiên hay không? [bản sao]


6

Câu hỏi này đã có câu trả lời ở đây:

Đôi khi tôi muốn có nhiều dữ liệu ngẫu nhiên cao, ví dụ để ghi đè lên một tệp hoặc thậm chí toàn bộ đĩa cứng. Tôi có nên sử dụng /dev/random hoặc là /dev/urandom? Những lợi thế hoặc bất lợi của mỗi là gì? Có một lựa chọn tốt hơn?


Thật tốt khi thấy bạn đăng bài này!
JakeGould

Câu trả lời:


11

Đố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/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.


Tôi nghĩ rằng bạn đứng cho unblocked, nhưng đó là một chi tiết. Câu trả lời tốt!
Wouter Verhelst

Wikipedia tuyên bố "không giới hạn", với một trích dẫn của hàm kernel random_read_unlimited, nhưng "bỏ chặn" cũng có ý nghĩa hoàn hảo. Theo trang này, bạn thực sự không thể nhận được hơn 32 MB trong số /dev/urandom trong một lần đọc dù sao đi nữa
CBHacking

Tôi luôn cho rằng u là không dấu, giống như uint là một số nguyên không dấu trong nhiều ngôn ngữ. Rất nhiều thông tin, cảm ơn
Patrick L
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.