Tại sao viết vào / dev / ngẫu nhiên không làm cho việc đọc song song từ / dev / ngẫu nhiên nhanh hơn?


22

Thông thường đọc từ /dev/randomtạo ra 100-500 byte và các khối, chờ đợi một entropy được thu thập.

Tại sao không viết thông tin cho /dev/randomcác quá trình khác tăng tốc độ đọc? Nó không nên cung cấp entropy cần thiết?

Nó có thể hữu ích cho việc bỏ chặn gpghoặc phần mềm tương tự mà không cần khởi động lại và nhập lại mọi thứ, để tạo các khóa không siêu bí mật, v.v.


3
Chỉ cần đọc từ /dev/urandomthay thế. /dev/urandomlà an toàn như /dev/randomđối với việc sử dụng mật mã , hành vi của /dev/randomthiết kế xấu.
Gilles 'SO- đừng trở nên xấu xa'

1
Làm thế nào để chuyển đổi gpg --gen-keytừ /dev/randomtới /dev/urandommà không cần khởi động lại?
Vi.

IIRC gpgđã /dev/randomđược mã hóa cứng. Bạn có thể thay đổi cấu hình udev của mình để tạo /dev/randomra cùng một thiết bị /dev/urandom, trong số các khả năng khác.
Gilles 'SO- đừng trở nên xấu xa'

@Gilles, nó vẫn yêu cầu khởi động lại gpg --gen-key, do đó, kết thúc lại dữ liệu mà nó yêu cầu tương tác (hoặc sử dụng các phương thức thông minh hơn như chỉ định thêm tham số dòng lệnh). Ngoài ra thời gian CPU tạo ra số nguyên tố bị mất (gpg có thể hoạt động một phút, in một số +es và sau đó yêu cầu thêm dữ liệu ngẫu nhiên). Và nó mang lại cảm giác "chúng ta hãy quay lại và đi con đường khác" thay vì "hãy dùng búa và buộc nó về phía trước" ...
Vi.

Câu trả lời:


19

Bạn có thể viết thư /dev/randomvì đó là một phần của cách cung cấp thêm byte ngẫu nhiên /dev/random, nhưng nó không đủ, bạn cũng phải thông báo cho hệ thống rằng có thêm entropy thông qua một ioctl()cuộc gọi.

Tôi cần cùng chức năng để kiểm tra chương trình thiết lập thẻ thông minh của mình , vì tôi không muốn đợi chuột / bàn phím của mình tạo đủ cho một số cuộc gọi gpgđược thực hiện cho mỗi lần chạy thử. Những gì tôi đã làm là chạy chương trình Python, song song với các thử nghiệm của tôi. Tất nhiên nó không nên được sử dụng cho việc gpgtạo khóa thực sự , vì chuỗi ngẫu nhiên hoàn toàn không phải là ngẫu nhiên (thông tin ngẫu nhiên do hệ thống tạo ra vẫn sẽ được xen kẽ). Nếu bạn có một nguồn bên ngoài để đặt chuỗi cho random, thì bạn sẽ có thể có entropy cao. Bạn có thể kiểm tra entropy với:

cat /proc/sys/kernel/random/entropy_avail

Chương trình:

#!/usr/bin/env python
# For testing purposes only 
# DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES

import fcntl
import time
import struct

RNDADDENTROPY=0x40085203

while True:
    random = "3420348024823049823-984230942049832423l4j2l42j"
    t = struct.pack("ii32s", 8, 32, random)
    with open("/dev/random", mode='wb') as fp:
        # as fp has a method fileno(), you can pass it to ioctl
        res = fcntl.ioctl(fp, RNDADDENTROPY, t)
    time.sleep(0.001)

(Đừng quên giết chương trình sau khi bạn hoàn thành.)


1
Giải pháp đơn giản hơn nhiều sẽ được sử dụng rngd. Nó có sẵn như là một gói trong hầu hết (tất cả?).
Patrick

4
random = "3420348024823049823-984230942049832423l4j2l42j"xem xkcd.com/221
user253751

@Patrick Tôi đã thử ít nhất 3 giải pháp tiềm năng để thêm tính ngẫu nhiên, IIRC rngd là một trong số đó. Nhưng chúng sẽ không hoạt động tốt (có thể là thiết lập Ubuntu 12.04 vào thời điểm đó) và đối với tôi, giải pháp này, với 10 dòng mã, đơn giản hơn.
Anthon

@Anthon: với tư cách là một sidenote, tôi dường như không xs4all.nl kể từ khi mitnik sử dụng nó để lưu trữ một số thứ, nhiều thập kỷ trước ... :)
woliveirajr

@woliveirajr, tôi đã có tài khoản của mình từ hacktic.nl chuyển đến đó vào năm 1992, tôi đã ở đó một thời gian mặc dù tôi đã không sống ở Hà Lan hơn 20 năm nay.
Anthon

14

Thông thường, nó được thiết kế bởi các nhà phát triển kernel và được ghi lại trong man 4 random:

Writing to /dev/random or /dev/urandom will update the entropy pool
with the data written, but this will not result in a higher entropy
count.  This means that it will impact the contents read from both
files, but it will not make reads from /dev/random faster.

1

Anthony đã giải thích rằng viết để /dev/randomkhông làm tăng số lượng entropy và chỉ ra cách RNDADDENTROPY ioctl (xem ngẫu nhiên (4) ) có thể được sử dụng để ghi có cho entropy. Nó rõ ràng là không thực sự an toàn, vì vậy đây là một giải pháp thay thế khi có sẵn một bộ tạo số ngẫu nhiên phần cứng.

Việc triển khai sau đây lấy ngẫu nhiên 512 byte (4096 bit) từ /dev/hwrngvà chuyển tiếp nó đến nhóm entropy (ghi có 4 bit entropy cho mỗi byte, đây là một lựa chọn tùy ý từ tôi). Sau đó, nó sẽ gọi tòa nhà chọn lọc (2) để chặn khi nhóm entropy đầy (ghi lại trong manpage ngẫu nhiên (4) ).

Phiên bản Python:

import fcntl, select, struct
with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd:
    while True:
        d = hw.read(512)
        fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d)
        select.select([], [rnd], [])

Vì iso Arch Linux chưa cài đặt Python, nên đây cũng là phiên bản Perl:

open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die;
for (;;) {
    my $l = read $hw, my $d, 512;
    ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die;
    vec(my $w, fileno $rnd, 1) = 1;
    select undef, $w, undef, undef
}

Đây có lẽ là những gì chương trình rngd (một phần của công cụ rng ) thực hiện (chưa được xác minh), ngoại trừ việc nó sử dụng các công cụ (Python hoặc Perl) đã có sẵn.


Nếu bạn không có trình tạo số ngẫu nhiên phần cứng, bạn có thể sử dụng /dev/urandomthay vì /dev/hwrngnếu bạn hoàn toàn không quan tâm đến các giá trị ngẫu nhiên không an toàn .
Lekensteyn

Hmm, tôi phát hiện ra rằng các thiết bị hwrng sẽ tự động tạo entropy khi cần, không cần thêm rngd hoặc script. Có một lỗi mặc dù khi tòa nhà getrandom()được sử dụng với hwrng trên các nhân cũ hơn 4,8-RC1 dẫn đến hành vi chặn. Một cách giải quyết là read()hai lần từ /dev/random, xem github.com/Lekensteyn/archdir/commit/
mẹo
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.