ทำไมการเขียนถึง / dev / random ไม่ทำให้การอ่านแบบขนานจาก / dev / random เร็วขึ้น?


22

โดยปกติแล้วการอ่าน/dev/randomจะสร้าง 100-500 ไบต์และบล็อกรอเอนโทรปีที่จะรวบรวม

ทำไมการไม่เขียนข้อมูลถึง/dev/randomกระบวนการอื่นทำให้การอ่านเร็วขึ้น? มันไม่ควรให้เอนโทรปีที่ต้องการหรือ

มันจะมีประโยชน์สำหรับการยกเลิกการปิดกั้นgpgหรือซอฟต์แวร์ที่คล้ายกันโดยไม่ต้องรีสตาร์ทและป้อนทุกอย่างใหม่เพื่อสร้างคีย์ที่ไม่ได้เป็นความลับสุดยอด ฯลฯ


3
แค่อ่าน/dev/urandomแทน /dev/urandomมีความปลอดภัยเท่ากับ/dev/randomการใช้การเข้ารหัสลับพฤติกรรมของ/dev/randomการออกแบบที่ไม่ดี
Gilles 'หยุดความชั่วร้าย'

1
วิธีการเปลี่ยนgpg --gen-keyจาก/dev/randomเป็น/dev/urandomโดยไม่ต้องเริ่มใหม่ได้อย่างไร
วิ

IIRC gpgได้/dev/randomกำหนดค่าตายตัว คุณสามารถเปลี่ยนการกำหนดค่า evev ของคุณเพื่อให้/dev/randomอุปกรณ์เดียวกันกับ/dev/urandomความเป็นไปได้อื่น ๆ
Gilles 'หยุดชั่วร้าย'

@Gilles มันยังคงต้องเริ่มต้นใหม่gpg --gen-keyดังนั้นข้อมูลอีกครั้งที่จะถามโต้ตอบ (หรือใช้วิธีการที่ชาญฉลาดมากขึ้นเช่นการระบุพารามิเตอร์บรรทัดคำสั่งเพิ่มเติม) นอกจากนี้เวลา CPU ที่สร้าง Prime Prime จะหายไป (gpg สามารถทำงานได้ในนาทีพิมพ์+es แล้วขอข้อมูลแบบสุ่มเพิ่มเติม) และให้ "ลองย้อนกลับไปเส้นทางอื่น" รู้สึกแทน "เอาค้อนมาแล้วบังคับให้ไปข้างหน้า" ...
Vi

คำตอบ:


19

คุณสามารถเขียนถึง/dev/randomเพราะเป็นส่วนหนึ่งของวิธีการเพิ่มไบต์แบบสุ่มให้/dev/randomแต่ไม่เพียงพอคุณต้องแจ้งให้ระบบทราบว่ามีการioctl()เรียกใช้ข่าวสารเพิ่มเติมจากการโทร

ฉันต้องการฟังก์ชั่นแบบเดียวกันสำหรับการทดสอบโปรแกรมการตั้งค่าสมาร์ทการ์ดของฉันเนื่องจากฉันไม่ต้องการรอให้เมาส์ / คีย์บอร์ดของฉันสร้างขึ้นเพียงพอสำหรับการโทรหลายครั้งเพื่อทำการโทรgpgแต่ละครั้ง สิ่งที่ฉันทำคือเรียกใช้โปรแกรม Python ซึ่งตามมาควบคู่กับการทดสอบของฉัน แน่นอนว่าไม่ควรใช้เลยสำหรับการgpgสร้างคีย์จริงเนื่องจากสตริงการสุ่มไม่ได้สุ่มเลย (ระบบที่สร้างข้อมูลแบบสุ่มจะยังคงถูกอินเตอร์ลีท) หากคุณมีแหล่งภายนอกเพื่อตั้งค่าสายอักขระrandomจากนั้นคุณควรจะสามารถมีเอนโทรปีสูง คุณสามารถตรวจสอบเอนโทรปีได้ด้วย:

cat /proc/sys/kernel/random/entropy_avail

โปรแกรม:

#!/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)

(อย่าลืมที่จะฆ่าโปรแกรมหลังจากเสร็จสิ้น)


1
rngdวิธีการแก้ปัญหาที่ง่ายมากที่จะใช้ มีให้บริการเป็นแพ็คเกจใน distros ส่วนใหญ่ (ทั้งหมดหรือไม่)
Patrick

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

@ แพทริคฉันลองอย่างน้อย 3 โซลูชั่นที่เป็นไปได้สำหรับการเพิ่มแบบแผน IIRC rngd เป็นหนึ่งในนั้น แต่พวกเขาจะไม่ทำงานนอกกรอบ (อาจเป็นการตั้งค่า Ubuntu 12.04 ในเวลานั้น) และสำหรับฉันโซลูชันนี้พร้อมรหัส 10 บรรทัดง่ายขึ้น
Anthon

@ อันธพาล: ในฐานะ sidenote ฉันไม่ได้ดู xs4all.nl ตั้งแต่ mitnik ใช้มันเพื่อจัดเก็บบางสิ่งเมื่อหลายสิบปีก่อน ... :)
woliveirajr

@ woliveirajr ฉันมีบัญชีของฉันจาก hacktic.nl ย้ายไปอยู่ที่นั่นในปี 1992 ฉันอยู่ที่นั่นซักพักแล้วแม้ว่าฉันจะไม่ได้อาศัยอยู่ในเนเธอร์แลนด์มานานกว่า 20 ปีแล้วก็ตาม
Anthon

14

โดยทั่วไปจะออกแบบโดยนักพัฒนาเคอร์เนลและจัดทำเอกสารใน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

แอนโทนี่อธิบายแล้วว่าการเขียนถึง/dev/randomไม่เพิ่มจำนวนเอนโทรปีและแสดงให้เห็นว่า RNDADDENTROPY ioctl (ดูที่สุ่ม (4) ) สามารถใช้เป็นเครดิตสำหรับเอนโทรปีได้อย่างไร เห็นได้ชัดว่าไม่ปลอดภัยจริง ๆ ดังนั้นนี่เป็นอีกทางเลือกหนึ่งเมื่อตัวสร้างหมายเลขสุ่มฮาร์ดแวร์พร้อมใช้งาน

การใช้งานต่อไปนี้ใช้ 512 ไบต์ (4096 บิต) ของการสุ่มจาก/dev/hwrngและส่งต่อไปยังพูลเอนโทรปี (ให้เครดิตเอนโทรปี 4 บิตต่อไบต์นี่เป็นตัวเลือกโดยพลการจากฉัน) หลังจากนั้นมันจะเรียกใช้select (2) syscall เพื่อบล็อกเมื่อพูลเอนโทรปีเต็ม (บันทึกในmanpage แบบสุ่ม (4) )

งูหลามรุ่น:

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], [])

เนื่องจาก iso Arch Linux iso ไม่ได้ติดตั้ง Python นี่เป็นเวอร์ชั่น 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
}

นี่อาจเป็นสิ่งที่โปรแกรม rngd (ส่วนหนึ่งของrng-tools ) ทำ (ไม่ได้ตรวจสอบ) ยกเว้นว่ามันใช้เครื่องมือ (Python หรือ Perl) ที่มีอยู่ทั่วไป


ถ้าคุณไม่มีเครื่องกำเนิดไฟฟ้าจำนวนสุ่มฮาร์ดแวร์คุณสามารถใช้/dev/urandomแทน/dev/hwrngถ้าคุณอย่างไม่สนใจเกี่ยวกับค่าสุ่มที่ไม่ปลอดภัย
Lekensteyn

อืมฉันพบว่าอุปกรณ์ hwrng สร้างเอนโทรปีโดยอัตโนมัติเมื่อต้องการไม่จำเป็นต้องใช้ rngd หรือสคริปต์เพิ่มเติม มีข้อผิดพลาดแม้ว่าเมื่อใช้getrandom()syscall กับ hwrng บนเมล็ดที่มีอายุมากกว่า 4.8-rc1 ซึ่งส่งผลให้เกิดพฤติกรรมการบล็อก วิธีแก้ปัญหาคือการread()สองครั้งจาก/dev/randomดูgithub.com/Lekensteyn/archdir/commit/ …
Lekensteyn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.