Vì Bộ sưu tập rác không mang tính quyết định, tại sao nó không được sử dụng để tạo số ngẫu nhiên an toàn?


13

Tôi hiểu rằng / dev / ngẫu nhiên là một nguồn entropy tốt và là thứ thường được sử dụng-- Giống như tôi đang đọc trên GC, ít nhất là trong Java, có vẻ như đã chấp nhận rằng trình nền bộ sưu tập rác thực thi không xác định . Nếu điều này là đúng, tại sao chúng ta không sử dụng thời gian của bộ sưu tập rác làm nguồn entropy thay vì biến / dev / ngẫu nhiên?


7
hãy xem một số tài liệu cho các hàm rand () trong thư viện C tiêu chuẩn. Họ đặc biệt gọi rằng trong khi họ cung cấp cho bạn số xuất hiện ngẫu nhiên, chúng không thể được sử dụng để bảo mật. Công cụ thu gom rác điển hình của bạn có thể sẽ rơi vào cùng loại. Nếu bạn định sử dụng một để bảo mật, bạn phải chắc chắn rằng bạn sử dụng trình thu gom rác an toàn bằng mật mã.
DXM

15
một cái gì đó không đặc biệt vẫn có thể được dự đoán cao
ratchet freak

7
Trong trường hợp này "không xác định" là một mô tả kém. Trình thu gom rác là một hệ thống hoàn toàn xác định và nếu bạn có kiến ​​thức đầy đủ về trạng thái của nó và trạng thái của chương trình sử dụng nó, bạn có thể dự đoán kết quả một cách xác định.
Gort Robot

4
@DXM bạn có biết một triển khai tốt cho trình thu gom rác an toàn bằng mật mã không? ;)
AJMansfield

7
"Bất kỳ ai xem xét các phương pháp số học sản xuất các chữ số ngẫu nhiên, tất nhiên, là trong tình trạng tội lỗi." - John von Neumann
Mark Adler

Câu trả lời:


58

"Không xác định" và "ngẫu nhiên" là hai khái niệm hoàn toàn khác nhau.

Hoạt động chính xác của trình thu gom rác không được chỉ định và tùy thuộc vào trình thu gom rác (thường được thực hiện bởi một VM loại, nhưng không nhất thiết).

Do đó, bạn không có thời gian xác định (tức là xác định) mà tại đó rác sẽ được thu thập.

Tuy nhiên, bất kỳ triển khai cụ thể nào cũng sẽ tuân theo một số quy tắc và có khả năng cao là hai lần chạy tiếp theo của cùng một chương trình sẽ có các mẫu thu gom rác rất giống nhau.

Do đó, thực tế entropy được cung cấp bởi một nhà sưu tập rác sẽ rất thấp (và tìm ra phần bạn thực sự có thể sử dụng như entropy sẽ được khôn lanh).

Để so sánh: A HashMaptrong Java không đảm bảo bất kỳ thứ tự truy xuất nào cho các thành viên của nó (về cơ bản vì đảm bảo nó sẽ thêm một chi phí không đáng để trả, hầu hết thời gian). Tuy nhiên đối với một cho việc thực hiện và một cho bộ chèn / gỡ bỏ, bạn có thể chắc chắn tính toán thứ tự kết quả. Chỉ vì không có gì đảm bảo cho bất kỳ đơn hàng nào, không có nghĩa là đơn hàng đó là ngẫu nhiên.


20
Tôi nghĩ rằng sẽ là một tuyên bố công bằng để nói rằng nếu một máy tính từng làm điều gì đó thực sự không xác định, thì máy tính đó đã bị hỏng.
Schilcote

Không xác định cũng có thể có nghĩa là nó phụ thuộc vào một số trạng thái bên ngoài của chương trình, bản thân nó có thể là xác định, nhưng sẽ hoàn toàn không liên quan đến chính chương trình và do đó có thể khác nhau mỗi khi chương trình chạy.
asmeker

@asmeker Tôi không nghĩ rằng tôi đã nghe những thuật ngữ này trong bất kỳ bối cảnh nào như vậy. Trên thực tế, tôi thậm chí không chắc ý của bạn là gì: Mọi chương trình lấy đầu vào bên ngoài (nghĩa là các chương trình hữu ích nhất) "dựa vào một số trạng thái bên ngoài", nhưng điều đó không làm cho nó không mang tính quyết định.
us2012

2
@Schilcote: Một số CPU hiện đại có RNG không xác định (đúng) được triển khai trong phần cứng. Đây thực sự là không xác định xuống vật lý cấp lượng tử.
MSalters

2
@Schilcote Ngay cả khi không có hướng dẫn RNG chuyên biệt (RDRAND và RDSEED của Intel), máy tính không hoàn toàn mang tính quyết định. Một số thời gian không hoàn toàn được chỉ định và có thể phụ thuộc vào các yếu tố bên ngoài như nhiệt độ.
CodeInChaos

8

Thứ nhất, chúng ta phải cẩn thận để không rơi vào cái bẫy của lý luận bằng cách thao túng các từ đơn thuần. Chẳng hạn, chúng ta có thể hỏi, vì NFA là "máy tự động hữu hạn không xác định", tại sao chúng ta không sử dụng nó để lấy số ngẫu nhiên? Trong trường hợp đó, đó sẽ là vì đó không phải là "không xác định" nghĩa là gì trong một NFA; trong thực tế, khi chúng ta mô phỏng một NFA, trên một đầu vào nhất định, hành vi của mô phỏng là hoàn toàn xác định.

"Xác định" là một cụm từ được tải. Đối với một lập trình viên máy tính hoặc nhà khoa học máy tính, hành vi không xác định chỉ có nghĩa là "xác định hành vi chính xác là phức tạp để suy nghĩ" và phụ thuộc vào quá nhiều yếu tố, bao gồm cả đầu vào chương trình.

Tuy nhiên, điều đó không có nghĩa là nó không mang tính quyết định đối với ai đó có động cơ tấn công một hệ thống mật mã. Đôi khi các yếu tố môi trường và đầu vào có thể được ghim xuống và các mẫu lặp lại xuất hiện từ hành vi "không xác định".

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.