Tại sao my / dev / ngẫu nhiên quá chậm khi sử dụng dd?


29

Tôi đang cố gắng để xóa một cách an toàn một loạt các ổ đĩa cứng. Sau đây là làm việc ở 20-50Mb / s

dd if=/dev/zero of=/dev/sda

Nhưng

dd if=/dev/random of=/dev/sda 

dường như không làm việc Ngoài ra khi tôi gõ

dd if=/dev/random of=stdout

Nó chỉ cung cấp cho tôi một vài byte bất kể tôi chuyển nó cho bs = và Count =

Tôi đang sử dụng / dev / ngẫu nhiên sai? Tôi cần tìm thông tin nào khác để chuyển sự cố này về phía trước? Có cách nào khác để làm điều này với một kịch bản hoặc một cái gì đó như

makeMyLifeEasy | dd if=stdin of=/dev/sda

Hoặc điều tương tự...


1
Cũng như một ghi chú: Trừ khi bạn nghi ngờ CIA theo dõi dữ liệu của bạn, một ghi đè duy nhất bằng số không (/ dev / zero) có lẽ là đủ. Xem ví dụ: superuser.com/questions/215852/ cấp để thảo luận.
sleske

Về lý do tại sao việc đọc từ /dev/randomchỉ trả về một vài byte, hãy xem superuser.com/a/712515/139307
mkuity0

Câu trả lời:


42

Cả hai /dev/random/dev/urandomsử dụng một "hồ bơi entropy". Khi pool hết, /dev/randomchờ 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/urandomsẽ tiếp tục cung cấp cho bạn dữ liệu giả ngẫu nhiên. /dev/randomvề mặt lý thuyết là chất lượng cao hơn, nhưng /dev/urandomgần như chắc chắn đủ tốt cho mục đích của bạn. (Nhưng thậm chí /dev/urandomcó 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/randomhay /dev/urandom, thì có lẽ bạn muốn sử dụng cái sau. Theo nguyên tắc chung, /dev/urandomnê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/randomgiao 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/randomthự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/randomthườ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":

  1. 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ã.

  2. Các máy phát điện thích /dev/random/dev/urandomthu 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/randomra 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ự .

  3. 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.


2
Thậm chí / dev / urandom là loại chậm nếu bạn phải điền vào một lượng lớn dung lượng đĩa (như toàn bộ phân vùng, trước khi tạo hệ thống tệp được mã hóa trên chúng). Điều này nên được coi là bổ sung nhỏ cho câu trả lời xuất sắc và giải thích chi tiết.
vtest

Vì bạn không thể tính toán / lấy / tạo / ... nhiều hơn một bit entropy từ một bit ngẫu nhiên, bất cứ điều gì tạo ra / xuất ra nhiều bit 'ngẫu nhiên' hơn so với nhận được là theo định nghĩa giả ngẫu nhiên. Do đó, /dev/urandomrõ ràng là giả ngẫu nhiên. /dev/randomkhác ở chỗ nó cố gắng đưa ra một ước tính bảo thủ về entropy đầu vào của nó và không tạo ra entropy nhiều hơn nó (nghĩ rằng nó) thực sự có thể. Điều này độc lập với sự hiện diện của một thiết bị TRNG chuyên dụng, bởi vì entropy thực sự cũng có thể được lấy từ các sự kiện độc lập dưới bất kỳ hình thức nào, như bàn phím hoặc IO mạng theo thời gian.
JimmyB

13

/dev/randomlà một nguồn của entropy thực sự, các byte thực sự ngẫu nhiên. Như vậy, nó cần một nguồn ngẫu nhiên. Bạn có thể 'sử dụng hết' sự ngẫu nhiên bằng cách đọc từ nó. Nó sẽ cung cấp cho bạn tất cả sự ngẫu nhiên mà nó có, sau đó chặn cho đến khi nó nhận được nhiều hơn. Có lẽ bạn chỉ ngồi đó chờ đợi, và máy nhận được rất ít sự ngẫu nhiên mới, và nó chỉ chờ.

/dev/randomcho tiền điện tử thực sự ngẫu nhiên, ngẫu nhiên chất lượng cao. Như vậy, nó là quá mức cần thiết cho một ổ đĩa ghi đè. Viết từ /dev/zeromột vài lần là tốt. Hoặc bạn có thể viết từ /dev/urandomđó, nó sẽ không chặn và đưa ra các số giả ngẫu nhiên khi nó hết ngẫu nhiên thực sự.


10
Không, /dev/randomkhông tạo ra "byte thực sự ngẫu nhiên". Nó tạo ra các byte giả chất lượng cao hơn so với /dev/urandom.
Keith Thompson

7

Trong Linux / dev / Random là một tệp đặc biệt phục vụ các số ngẫu nhiên giả chất lượng cao. Việc thực hiện này thu thập entropy từ các sự kiện bắt nguồn từ các ngắt bàn phím, chuột, đĩa và hệ thống. (tham khảo tài liệu này ) Vì vậy, khi không có sự kiện nào như vậy, nhóm entropy trống, các lần đọc từ / dev / ngẫu nhiên sẽ chặn cho đến khi tiếng ồn môi trường bổ sung được thu thập. Điều này giải thích vấn đề của bạn. Để điền vào hồ bơi entropy, bạn có thể nhấn phím trên bàn phím.

Mặt khác, một bộ tạo số ngẫu nhiên thực sự sử dụng bộ tạo số ngẫu nhiên Phần cứng tạo ra các số ngẫu nhiên từ các quá trình vật lý. Các quy trình này bao gồm các hiện tượng vi mô tạo ra tín hiệu "nhiễu" ngẫu nhiên ở mức độ thấp, chẳng hạn như nhiễu nhiệt hoặc hiệu ứng quang điện hoặc hiện tượng vật lý khác. Về mặt lý thuyết, các quá trình này hoàn toàn không thể đoán trước được và các xác nhận của lý thuyết về tính không thể đoán trước được phải chịu thử nghiệm thực nghiệm.

Một bộ tạo số ngẫu nhiên phần cứng thường bao gồm một bộ chuyển đổi để chuyển đổi một số khía cạnh của hiện tượng vật lý thành tín hiệu điện, bộ khuếch đại và mạch điện tử khác để tăng biên độ dao động ngẫu nhiên lên mức vĩ mô và một số loại chuyển đổi tương tự sang kỹ thuật số để chuyển đổi đầu ra thành một số kỹ thuật số, thường là một chữ số nhị phân đơn giản 0 hoặc 1. Bằng cách liên tục lấy mẫu tín hiệu thay đổi ngẫu nhiên, thu được một loạt các số ngẫu nhiên.

Bộ tạo số ngẫu nhiên phần cứng tập hợp tiếng ồn môi trường từ trình điều khiển thiết bị và các nguồn khác vào một nhóm entropy. Từ số ngẫu nhiên nhóm entropy này được tạo ra. Khi đọc, thiết bị / dev / ngẫu nhiên sẽ chỉ trả về các byte ngẫu nhiên trong số lượng bit nhiễu ước tính trong nhóm entropy. Điều này giải thích vấn đề của bạn.

Một số triển khai RNG Phần cứng được giải thích trong tài liệu kernelthông tin trên thiết bị .

Một đối tác với / dev / ngẫu nhiên là / dev / urandom ("nguồn mở khóa ngẫu nhiên" / nguồn ngẫu nhiên không chặn) sử dụng lại nhóm nội bộ để tạo ra nhiều bit giả ngẫu nhiên hơn. Điều này có nghĩa là cuộc gọi sẽ không chặn, nhưng đầu ra có thể chứa ít entropy hơn so với đọc tương ứng từ / dev / ngẫu nhiên.

Vì vậy, nếu ý định của bạn không phải là tạo CSPRNG (trình tạo số giả ngẫu nhiên bảo mật bằng mật mã), bạn nên sử dụng / dev / urandom.


/dev/randomthực sự sử dụng các nguồn như tiếng ồn nhiệt? Tôi hiểu rằng nó sử dụng thông tin từ (tương đối) trạng thái hệ thống không thể đoán trước, chẳng hạn như hoạt động I / O và trạng thái quá trình. Tôi không nghĩ rằng hầu hết các hệ thống Linux thậm chí có phần cứng có thể thu được tiếng ồn nhiệt. Bạn có thể trích dẫn một số tài liệu về điều này?
Keith Thompson

vâng, bạn đúng Thông tin tôi đã đề cập có thể áp dụng cho Trình tạo số ngẫu nhiên phần cứng chung.
Sachin Divekar

Nhìn vào tài liệu về cách nó được thực hiện trong linux tại liên kết . Ở đó, người ta đã đề cập rằng trong môi trường PC, LRNG thu thập entropy từ các sự kiện bắt nguồn từ các ngắt bàn phím, chuột, đĩa và hệ thống. Trong các môi trường khác, LRNG tập hợp entropy từ các tài nguyên có sẵn. Ví dụ: bộ định tuyến OpenWRT không bao gồm đĩa cứng, chuột và bàn phím và do đó chúng không thể được sử dụng làm nguồn entropy. Mặt khác, bộ định tuyến thu thập entropy từ các sự kiện mạng.
Sachin Divekar

Có lẽ bạn có thể cập nhật câu trả lời của bạn. Tôi không tin chính xác khi nói rằng nó /dev/randomtạo ra "những con số thực sự ngẫu nhiên".
Keith Thompson

/ dev / bài viết ngẫu nhiên trên wikipedia nói, Linux là hệ điều hành đầu tiên triển khai trình tạo số ngẫu nhiên thực sự theo cách này trong đoạn đầu tiên.
Sachin Divekar

2

Không trả lời câu hỏi của bạn - đã có câu trả lời đầy đủ ở đây - bạn cũng có thể xem Darik's Boot và Nuke aka DBAN , một công cụ gạt đĩa CD trực tiếp.


0

Chỉ cần sử dụng shredlệnh đi kèm với coreutils. Nó sử dụng dữ liệu ngẫu nhiên một cách hiệu quả. dd là một công cụ cấp thấp và có lẽ đó là một mức độ quá thấp cho nhiệm vụ này. shredchẳng hạn như sẽ bỏ qua các phần không thể chấp nhận được của thiết bị.

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.