Số ngẫu nhiên trong Linux


-1

Trong linux / dev / Random dựa trên "biến môi trường" và / dev / urandom dựa trên thuật toán và thời gian. Câu hỏi của tôi là:

Trường hợp / dev / ngẫu nhiên thu thập các biến này từ.

Và nếu bạn có hai máy được đặt cùng một lúc (giảm đến mili giây - nếu có thể) và có cùng tốc độ, HĐH, v.v ... và lấy một thập phân / dev / urandom với số byte X, chúng sẽ có cùng một giá trị chính xác (vì thời gian là như nhau)?


2
-1 vì / dev / urandom vào Google xuất hiện khá nhiều câu trả lời trong kết quả đầu tiên.
pnuts

Câu trả lời:


4

Trường hợp / dev / urandom thu thập các biến này từ đâu.

Ở mọi nơi nó có thể, chủ yếu là thời gian gián đoạn. Ví dụ: nếu bạn có card mạng, thời gian chính xác mà gói tin đến sẽ bị ảnh hưởng bởi độ lệch giữa cơ sở thời gian tinh thể trên card mạng và cơ sở thời gian tinh thể đồng hồ CPU. Sự bù trừ giữa hai bộ dao động tinh thể thạch anh bị ảnh hưởng bởi các biến đổi nhiệt độ vùng vi mô được cho là thực sự ngẫu nhiên.

Nếu bạn có đĩa quay, thời gian đọc sẽ hoàn thành phụ thuộc vào tốc độ đĩa quay. Điều này bị ảnh hưởng bởi lực cắt hỗn loạn giữa bề mặt đĩa và không khí bên trong cụm đĩa. Mặc dù điều này không được tin là ngẫu nhiên thực sự, nhưng nó hoàn toàn không thể đoán trước hoặc lặp lại bởi bất kỳ cơ chế đã biết nào.

Và nếu bạn có hai máy được đặt cùng một lúc (giảm đến mili giây - nếu có thể) và có cùng tốc độ, HĐH, v.v ... và lấy một số thập phân / dev / ngẫu nhiên với số byte X, chúng sẽ có cùng một giá trị chính xác (vì thời gian là như nhau)?

Chà, một phần nghìn giây sẽ không đủ tốt. Bạn cần ở cùng cấp độ với CPU, đo thời gian - một phần tỷ giây. Nhưng, tất nhiên, đó là cách nó phải được. Mặt khác, nếu bạn thấy trạng thái của một máy, bạn có thể biết chắc chắn 100% rằng máy kia không thể có trạng thái tương tự. Và vì trạng thái được coi là ngẫu nhiên, bạn không thể nhìn vào bất kỳ máy nào khác và biết bất cứ điều gì về trạng thái với sự chắc chắn 100%. Chừng nào tỷ lệ cược này có thể đạt được là đủ thấp (giả sử, ít hơn một trong 2 ^ 100), thì nó hoàn toàn ổn.

Ngay cả khi bạn tung hai con xúc xắc, mỗi con có một tỷ cạnh, chúng có thể xuất hiện như nhau. Với điều kiện họ chỉ làm như vậy một lần trong một tỷ lần, thì đó là điều nên làm.


Bạn có một tài liệu tham khảo cho ví dụ card mạng? Tôi không thấy nó trong các nguồn kernel và phương pháp đó không được ghi lại trong drivers/char/random.c. Ví dụ về đĩa cứng dường như là add_disk_randomness gọi trong block/blk-core.c SAU.
Daniel Beck

Nó được tích hợp vào trình xử lý ngắt, thông qua handle_IRQ_event.
David Schwartz

3

Hãy xem urandom Hướng dẫn sử dụng, cụ thể là mô tả:

Khi đọc, thiết bị / dev / ngẫu nhiên sẽ chỉ trả về các byte ngẫu nhiên trong   số bit tiếng ồn ước tính trong nhóm entropy.   / dev / ngẫu nhiên phải phù hợp với những mục đích sử dụng cần chất lượng rất cao   tính ngẫu nhiên như pad một lần hoặc tạo khóa. Khi nào          nhóm entropy trống, đọ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.

Việc đọc từ thiết bị / dev / urandom sẽ không chặn chờ thêm entropy. Kết quả là, nếu không đủ   entropy trong nhóm entropy, các giá trị được trả về theo lý thuyết   dễ bị tấn công bằng mật mã vào các thuật toán được sử dụng bởi          người lái xe. Kiến thức về cách làm điều này không có sẵn trong tài liệu chưa được phân loại hiện tại, nhưng về mặt lý thuyết là có thể   một cuộc tấn công như vậy có thể tồn tại. Nếu đây là một mối quan tâm trong ứng dụng của bạn,   sử dụng / dev / ngẫu nhiên thay thế.

Thật không may, tôi thực sự không thể trả lời câu hỏi thứ hai của bạn, tôi sử dụng người khác có thể, mặc dù tôi đoán là nó sẽ là rất khó để có được chính xác như nhau trên cả hai máy.


2

Trong linux / dev / urandom dựa trên "biến môi trường" và / dev / ngẫu nhiên dựa trên thuật toán và thời gian.

Cả hai giả định đều sai.

Theo ngẫu nhiên (4) - Trang người dùng Linux 1 , /dev/random 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 bể entropy .

Một ví dụ về một thiết bị như vậy là chuột. 2 Hãy thử thực hiện

head -c 1024 /dev/random | base64

để xóa nhóm entropy (hủy bỏ sau vài giây) và sau đó

head -c 40 /dev/random | base64

để đọc 40 byte từ /dev/random. Không làm gì cả và quan sát điều đó head lưu trữ một thời gian đăng nhập, vì không có entropy mới trong hồ bơi.

Hủy bỏ, sau đó thực hiện

head -c 40 /dev/random | base64

lần nữa. Lần này, di chuột nhanh từ trái sang phải. head sẽ hoàn thành nhiệm vụ của nó một cách nhanh chóng.

Một lần nữa, theo ngẫu nhiên (4) - Trang người dùng Linux , /dev/urandom sử dụng cùng một nhóm entropy, nhưng nó không chặn. Nếu hồ bơi entropy không đủ lớn, nó sẽ rơi trở lại trình tạo số giả (PRNG) để tạo thêm đầu ra ngẫu nhiên (giả).


1 Hành vi thực tế có thể thay đổi từ distro đến distro.

2 Ví dụ áp dụng cho Ubuntu 12.04. Các phân phối khác có thể khác nhau.


Chuột di chuyển có thể thông qua add_input_randomness gọi trong drivers/input/input.c từ những gì tôi có thể thấy.
Daniel Beck

Rất tiếc tôi đã lật chúng
agz

@ user1950278: Vẫn không đúng. Cả hai sử dụng cùng một hồ bơi entropy. random sử dụng trực tiếp urandom đưa nó đến một PRNG.
Dennis
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.