2011-01-27 38 views
33

Một số thông tin cơ bản: Tôi đang tìm cách chạy tập lệnh trên máy chủ Red Hat để đọc một số dữ liệu từ/dev/random và sử dụng lệnh Perl unpack() để chuyển đổi nó thành chuỗi hex để sử dụng sau này.). Tôi chạy một vài "đầu -1" trên/dev/ngẫu nhiên và nó dường như được làm việc ra tốt đẹp, nhưng sau khi gọi nó một vài lần, nó sẽ chỉ kinda treo. Sau một vài phút, nó cuối cùng sẽ xuất ra một khối văn bản nhỏ, sau đó kết thúc./dev/ngẫu nhiên Cực kỳ chậm?

Tôi chuyển sang/dev/urandom (Tôi thực sự không muốn, chậm hơn và tôi không cần chất lượng ngẫu nhiên đó) và nó hoạt động tốt cho hai hoặc ba cuộc gọi đầu tiên, sau đó nó cũng bắt đầu treo . Tôi đã tự hỏi nếu đó là lệnh "đầu" đã ném bom nó, vì vậy tôi đã thử làm một số I/O đơn giản sử dụng Perl, và nó cũng đã được treo. Như một nỗ lực mương cuối cùng, tôi đã sử dụng lệnh "dd" để kết xuất một số thông tin ra khỏi nó trực tiếp tới một tệp thay vì tới thiết bị đầu cuối. Tất cả những gì tôi hỏi về nó là 1mb dữ liệu, nhưng phải mất 3 phút để nhận được ~ 400 byte trước khi tôi giết nó.

Tôi đã kiểm tra danh sách quy trình, CPU và bộ nhớ cơ bản bị ảnh hưởng. Chính xác những gì có thể gây ra/dev/ngẫu nhiên để crap ra như thế này và những gì tôi có thể làm gì để ngăn ngừa/sửa chữa nó trong tương lai?

Chỉnh sửa: Cảm ơn các bạn đã giúp đỡ! Có vẻ như tôi đã ngẫu nhiên và urandom trộn lẫn. Tôi đã có kịch bản và chạy ngay bây giờ. Có vẻ như tôi đã học được điều gì đó mới mẻ hôm nay. :)

+9

Bạn dường như có 2 thiết bị được trộn lẫn; trên một hệ thống Linux,/dev/random là chất lượng cao, chặn thiết bị ngẫu nhiên. Nó sẽ "treo" khi không có entropy thu thập sẵn để tạo ra các số ngẫu nhiên chất lượng cao./dev/urandom nên không bị chặn và giả tạo. – geoffspear

+0

Liên quan đến '/ dev/random', xem [wiki] (http://en.wikipedia.org/wiki//dev/random):" Khi nhóm entropy trống, đọc từ/dev/random sẽ chặn cho đến khi bổ sung tiếng ồn môi trường được thu thập. " '/ dev/urandom' sẽ không bị chặn, bạn có chắc là bạn đã dùng nó không? – delnan

+0

như một sang một bên, bạn chạy 'đầu -1', điều này sẽ có tác dụng đọc một dòng, tức là. đọc cho đến khi nó gặp một dòng mới. nếu bạn đang cố gắng đọc một lượng nhỏ dữ liệu, có lẽ bạn nên sử dụng 'dd'. – Hasturkun

Trả lời

38

Trên hầu hết các hệ thống Linux, /dev/random được cấp nguồn từ entropy thực tế được môi trường thu thập. Nếu hệ thống của bạn không cung cấp một lượng lớn dữ liệu từ /dev/random, điều đó có nghĩa là bạn không tạo ra đủ ngẫu nhiên môi trường để cấp nguồn cho nó.

Tôi không chắc tại sao bạn nghĩ rằng /dev/urandom là chất lượng "chậm hơn" hoặc cao hơn. Nó tái sử dụng một nhóm entropy nội bộ để tạo ra tính giả tạo - làm cho nó có chất lượng thấp hơn một chút - nhưng nó không chặn. Nói chung, các ứng dụng không yêu cầu mật mã cao cấp hoặc dài hạn có thể sử dụng /dev/urandom đáng tin cậy.

Hãy thử chờ một lúc sau đó đọc lại từ /dev/urandom. Có thể bạn đã cạn kiệt hồ bơi entropy nội bộ đọc rất nhiều từ /dev/random, phá vỡ cả hai máy phát điện - cho phép hệ thống của bạn tạo thêm entropy nên bổ sung chúng.

Xem Wikipedia để biết thêm thông tin về /dev/random/dev/urandom.

+0

Ah, có vẻ như tôi đã trộn lẫn cái nào trong số đó không được coi là an toàn cho việc sử dụng mật mã. Nếu tôi viết thư cho/dev/random (để trộn thêm dữ liệu ngẫu nhiên), điều này có giúp giải quyết vấn đề và tôi sẽ nhận được "lợi tức đầu tư"? (Ví dụ, nếu tôi viết trong 1MB dữ liệu, tôi sẽ được bảo đảm bao nhiêu MB để đọc, hoặc là ngay cả trường hợp?) –

+1

@GigaWatt: Điều đó thực sự phụ thuộc vào số lượng bit của entropy hệ thống nhận được từ bài viết của bạn.Điều này cũng sẽ khá vô ích nếu bạn không có nguồn entropy tốt hơn '/ dev/random', trong trường hợp này bạn nên để kernel xử lý nguồn entropy ở nơi đầu tiên – Hasturkun

+0

@GigaWatt: vâng, bạn có thể/dev/ngẫu nhiên nhưng điều đó sẽ không giúp đỡ bởi vì bạn sẽ không được gọi các cuộc gọi ioctl để tăng entropy và ngay cả khi bạn nhận được dữ liệu ngẫu nhiên chất lượng cao hơn, nó sẽ không được nhanh hơn. Đọc về rngd. – akostadinov

1

Nếu bạn muốn thêm entropy cho /dev/random thì bạn sẽ cần phải mua phần cứng RNG hoặc sử dụng một trong số *_entropyd daemons để tạo.

+0

tạo entropy là một vấn đề khó khăn. Nó an toàn hơn cho người dùng (bất kỳ ai không có kiến ​​thức mật mã sâu) để tránh thay đổi cơ chế mặc định. Tốt hơn thanh '/ dev/urandom' như được giải thích ở đây http://www.2uo.de/myths-about-urandom/ – akostadinov

1

Nếu bạn đang sử dụng ngẫu nhiên để thử nghiệm (không mã hóa), thì độ ngẫu nhiên lặp lại tốt hơn, bạn có thể nhận được điều này với giả ngẫu nhiên bắt đầu từ một hạt giống đã biết. Thường có một chức năng thư viện tốt cho điều này trong hầu hết các ngôn ngữ.

Có thể lặp lại, khi bạn tìm thấy sự cố và đang cố gỡ lỗi. Nó cũng không ăn entropy. Có thể được hạt giống máy phát ngẫu nhiên giả từ/dev/urandom và ghi lại hạt giống trong nhật ký kiểm tra. Perl có một trình tạo số ngẫu nhiên giả mà bạn có thể sử dụng.

+0

'/dev/random' giống như trình tạo giả như 'urandom' xem http: // www. 2uo.de/myths-about-urandom/ – akostadinov

+0

@akostadinov Bài báo nói rằng '/ dev/random' có thể chặn. Aso nó và '/ dev/urandom', như nó nói, không thể đoán trước. Vì vậy, như tôi đã nói không thể lặp lại, rất nghèo để thử nghiệm. –

+0

'/ dev/(u) random' là trình tạo số giả ngẫu nhiên. Khả năng dự đoán và độ lặp lại là các thuộc tính khác nhau. Bạn chỉ thiếu các điều khiển hạt nhân cần thiết để làm cho chúng có thể dự đoán và lặp lại (và cảm ơn Chúa vì điều đó). Tôi đồng ý các máy phát điện khác là tốt hơn cho các kịch bản thử nghiệm cụ thể. Câu trả lời của bạn Tôi phải đồng ý đưa ra lời khuyên hợp lý để sử dụng trường hợp sử dụng cụ thể. Nhưng SO sẽ không cho phép tôi hoàn nguyên phiếu bầu của mình cho đến khi câu trả lời được chỉnh sửa. Đó sẽ là một điều tốt anyway. – akostadinov

15

Câu hỏi này khá cũ. Nhưng vẫn có liên quan nên tôi sẽ trả lời. Nhiều CPU ngày nay đi kèm với bộ tạo số ngẫu nhiên phần cứng tích hợp (RNG). Cũng như nhiều hệ thống đi kèm với một mô-đun nền tảng tin cậy (TPM) cũng cung cấp một RNG. Ngoài ra còn có các tùy chọn khác có thể được mua nhưng rất có thể máy tính của bạn đã có thứ gì đó.

Bạn có thể sử dụng rngd từ gói rng-utils trên hầu hết các bản phân phối Linux để tạo nhiều dữ liệu ngẫu nhiên hơn. Ví dụ trên fedora 18 tất cả những gì phải làm để cho phép gieo mầm từ TPM và RNG CPU là:

# systemctl enable rngd 
# systemctl start rngd 

Bạn có thể so sánh tốc độ có và không có rngd. Bạn nên chạy rngd -v -f từ dòng lệnh. Điều đó sẽ cho bạn thấy các nguồn entropy được phát hiện. Đảm bảo tất cả các mô-đun cần thiết để hỗ trợ các nguồn của bạn được tải. Để sử dụng TPM, nó cần phải được kích hoạt thông qua các công cụ tpm. cập nhật: đây là nice howto.

BTW, tôi đã đọc trên Internet một số lo ngại về TPM RNG thường bị hỏng theo nhiều cách khác nhau, nhưng không đọc bất cứ điều gì cụ thể chống lại RNG được tìm thấy trong chip Intel, AMD và VIA. Sử dụng nhiều nguồn sẽ là tốt nhất nếu bạn thực sự quan tâm đến chất lượng ngẫu nhiên.

NSAIK urandom là tốt cho hầu hết các trường hợp sử dụng. Hầu hết các chương trình ngày nay sử dụng urandom thay vì ngẫu nhiên. Ngay cả openssl does that.

CẬP NHẬT: tùy chọn khác cho entropy hơn là HAVEGED. Trên máy ảo có kvm/qemu VirtIORNG.

6

sử dụng/dev/urandom, an toàn về mặt mã hóa của nó.

tốt đọc: http://www.2uo.de/myths-about-urandom/

"Nếu bạn không chắc chắn về việc liệu bạn nên sử dụng/dev/ngẫu nhiên hoặc/dev/urandom, sau đó có thể bạn muốn sử dụng sau này."

Khi nghi ngờ trong khởi động sớm, bạn có đủ entropy thu thập được không. sử dụng hệ thống gọi getrandom() để thay thế. [1] Tốt nhất của cả hai thế giới, nó chặn cho đến khi (chỉ một lần!) Đủ entropy được thu thập, sau đó nó sẽ không bao giờ chặn lại.

[1] git kernel commit

+3

Tại sao câu trả lời này lại bị bỏ phiếu? Nó có vẻ như là một câu trả lời tốt cho tôi ... nhưng có lẽ tôi đang thiếu vấn đề với nó. – MountainX

Các vấn đề liên quan