ทำไม / dev / random ของฉันช้านักเมื่อใช้ dd


29

ฉันกำลังพยายามลบฮาร์ดไดรฟ์จำนวนมากแบบกึ่งปลอดภัย กำลังทำงานที่ 20-50Mb / s ต่อไปนี้

dd if=/dev/zero of=/dev/sda

แต่

dd if=/dev/random of=/dev/sda 

ดูเหมือนจะไม่ทำงาน นอกจากนี้เมื่อฉันพิมพ์

dd if=/dev/random of=stdout

มันให้ฉันเพียงไม่กี่ไบต์โดยไม่คำนึงถึงสิ่งที่ฉันส่งให้ bs = และ count =

ฉันใช้ / dev / สุ่มผิดหรือเปล่า? ฉันควรหาข้อมูลอื่นใดเพื่อดำเนินการแก้ไขปัญหานี้ต่อไป มีวิธีอื่นในการทำเช่นนี้กับสคริปต์หรืออะไรทำนองนั้น

makeMyLifeEasy | dd if=stdin of=/dev/sda

หรืออะไรทำนองนั้น ...


1
เช่นเดียวกับหมายเหตุ: หากคุณไม่สงสัยว่าซีไอเอจะดำเนินการตามข้อมูลของคุณการเขียนทับด้วยศูนย์ (/ dev / ศูนย์) เพียงครั้งเดียวก็น่าจะเพียงพอแล้ว ดูเช่นsuperuser.com/questions/215852/…สำหรับการสนทนา
sleske

สำหรับสาเหตุที่การอ่านจาก/dev/randomส่งคืนข้อมูลเพียงไม่กี่ไบต์ให้ดูที่superuser.com/a/712515/139307
mklement0

คำตอบ:


42

ทั้งคู่/dev/randomและ/dev/urandomใช้ "เอนโทรปีพูล" เมื่อพูลหมด/dev/randomรอให้เติมใหม่ซึ่งต้องมีพฤติกรรมของระบบการตรวจสอบ (อินพุตคีย์บอร์ด, การเคลื่อนไหวของเมาส์ ฯลฯ ) ในขณะที่/dev/urandomจะให้ข้อมูลสุ่มหลอกคุณ /dev/randomมีคุณภาพสูงกว่าในทางทฤษฎี แต่/dev/urandomเกือบจะดีพอสำหรับวัตถุประสงค์ของคุณ (แต่/dev/urandomอาจจะช้ากว่าวิธีอื่น ๆ เร็วกว่า แต่คุณภาพต่ำกว่าเครื่องกำเนิดไฟฟ้าอาจดีพอสำหรับการลบฮาร์ดไดรฟ์ไม่ชัดเจนว่าผู้โจมตีจะได้รับประโยชน์จากการรู้ลำดับที่จะเกิดขึ้นหรือ ตัวเลขสุ่มนั้นดีกว่าสำหรับจุดประสงค์นี้มากกว่าลำดับเช่น 0, 1, 2, 3, 4, .... )

การอ้างถึงrandom(4)หน้าคน:

หากคุณไม่แน่ใจเกี่ยวกับว่าคุณควรใช้/dev/randomหรือ /dev/urandomไม่คุณอาจต้องการใช้อันหลัง ตามกฎทั่วไป/dev/urandomควรใช้สำหรับทุกสิ่งยกเว้นคีย์ GPG / SSL / SSH ที่มีอายุการใช้งานยาวนาน

UPDATE : หน้า `แบบสุ่ม (4) คนได้รับการปรับปรุงตั้งแต่ฉันเขียนมา ตอนนี้พูดว่า:

/dev/randomอินเตอร์เฟซที่ถือเป็นมรดกอินเตอร์เฟซและ /dev/urandomเป็นที่ต้องการและเพียงพอในกรณีการใช้งานทั้งหมดที่มีข้อยกเว้นของการใช้งานที่ต้องการสุ่มในช่วงเวลาบูตต้น; สำหรับแอปพลิเคชันเหล่านี้getrandom(2)จะต้องใช้แทนเพราะจะบล็อกจนกว่าจะเริ่มต้นพูลเอนโทรปี

ดูเพิ่มเติมได้ที่ " Myths about / dev / urandom " โดย Thomas Hühn

แต่/dev/urandomแม้ว่ามันจะไม่ปิดกั้น แต่ก็มีแนวโน้มที่จะช้าเกินไปหากคุณต้องการสร้างข้อมูลจำนวนมาก ทำการวัดบนระบบของคุณก่อนที่จะลอง

แก้ไข:ต่อไปนี้เป็นการพูดนอกเรื่องเกี่ยวกับตัวเลขสุ่ม "จริง" กับตัวเลขสุ่มหลอก หากสิ่งที่คุณสนใจคือคำตอบที่ใช้งานได้จริงคุณสามารถหยุดอ่านได้ทันที

ฉันดูเหมือนอ้างว่า (รวมถึงคำตอบอื่น ๆ ที่นี่) ซึ่ง/dev/randomใช้ตัวสร้างตัวเลขสุ่ม "จริง" ซึ่งตรงข้ามกับตัวสร้างตัวเลขสุ่มหลอก (PRNG) ตัวอย่างเช่นบทความ Wikipediaทำให้การเรียกร้องดังกล่าว ฉันไม่เชื่อว่าถูกต้อง มีการพูดถึงที่นี่ซึ่งอ้างถึงตัวสร้างหมายเลขสุ่มฮาร์ดแวร์ แต่ฉันไม่เห็นหลักฐานว่า/dev/randomโดยปกติแล้วจะใช้อุปกรณ์ดังกล่าวหรือคอมพิวเตอร์ทั่วไปที่มีอุปกรณ์ดังกล่าว พวกเขาแตกต่างจาก PRNG เช่นrand()ฟังก์ชั่นC เนื่องจากพวกเขาไม่ได้กำหนดค่าเนื่องจากพวกเขาเก็บเกี่ยวเอนโทรปีจากแหล่งที่ไม่สามารถคาดเดาได้จริง

ฉันจะบอกว่ามีตัวสร้างตัวเลข "สุ่ม" สามคลาส:

  1. กำหนด PRNGs เช่นrand()ฟังก์ชั่นของ C ซึ่งใช้อัลกอริทึมในการสร้างลำดับซ้ำที่มีคุณสมบัติทางสถิติของ (มากหรือน้อย) คุณสมบัติทางสถิติของลำดับสุ่มอย่างแท้จริง สิ่งเหล่านี้อาจดีพอสำหรับเกม (ให้วิธีการเพาะที่ดี) และจำเป็นสำหรับแอปพลิเคชันที่ต้องมีการทำซ้ำ แต่ไม่เหมาะสำหรับการเข้ารหัส

  2. เครื่องปั่นไฟชอบ/dev/randomและ/dev/urandomเก็บเกี่ยวเอนโทรปีจากแหล่งที่คาดเดาไม่ได้เช่นกิจกรรม I / O (นี่คือเหตุผลที่การห้ำหั่นบนแป้นพิมพ์หรือการเลื่อนเมาส์อาจทำให้เกิด/dev/randomข้อมูลมากขึ้น) มันไม่ชัดเจน (สำหรับฉัน) ว่าสิ่งเหล่านี้เป็นไปตามคำจำกัดความของ PRNG หรือไม่ (ฉันเคยเห็นคำจำกัดความที่บอกว่า PRNG นั้นเป็นสิ่งที่กำหนด) แต่ก็ไม่ได้เป็นเครื่องกำเนิดตัวเลขสุ่ม

  3. ตัวสร้างหมายเลขสุ่มฮาร์ดแวร์ที่คาดเดาไม่ได้ทางร่างกายแม้จะมีความรู้ที่สมบูรณ์เกี่ยวกับสถานะเริ่มต้นและยังใช้เทคนิคทางคณิตศาสตร์เพื่อให้แน่ใจว่าคุณสมบัติทางสถิติที่ถูกต้อง


2
แม้แต่ / dev / urandom ก็ค่อนข้างช้าถ้าคุณต้องเติมพื้นที่ดิสก์จำนวนมาก (เช่นพาร์ติชันทั้งหมดก่อนที่จะสร้างระบบไฟล์ที่เข้ารหัสไว้) นี่ควรเป็นส่วนเสริมเล็ก ๆ สำหรับคำตอบที่ยอดเยี่ยมและคำอธิบายโดยละเอียด
vtest

เนื่องจากคุณไม่สามารถคำนวณ / สืบทอด / สร้าง / ... มากกว่าหนึ่งบิตของเอนโทรปีจากบิตสุ่มหนึ่งบิตสิ่งใดที่สร้าง / เอาท์พุทบิต 'สุ่ม' มากกว่าที่ได้รับเนื่องจากอินพุตคือโดยนิยามหลอกแบบสุ่มที่ดีที่สุด ดังนั้น/dev/urandomชัดเจนคือหลอกหลอก /dev/randomแตกต่างจากที่มันพยายามทำการประมาณค่าเอนโทรปีของอินพุตและไม่ส่งออกเอนโทรปีมากกว่าที่คิด สิ่งนี้เป็นอิสระจากการมีอยู่ของอุปกรณ์ TRNG โดยเฉพาะเนื่องจากเอนโทรปีที่แท้จริงสามารถรับได้จากเหตุการณ์ที่เป็นอิสระทุกชนิดเช่นคีย์บอร์ดหรือเครือข่าย IO เทียบกับเวลา
JimmyB

13

/dev/randomเป็นแหล่งกำเนิดของเอนโทรปีที่แท้จริงสุ่มอย่างแท้จริงไบต์ ดังนั้นจึงจำเป็นต้องมีแหล่งที่มาของการสุ่ม คุณสามารถ 'ใช้' แบบสุ่มได้โดยอ่านจากมัน มันจะให้แบบแผนทั้งหมดที่คุณมีจากนั้นบล็อกจนกว่าจะได้รับมากขึ้น คุณอาจจะนั่งรออยู่ที่นั่นและเครื่องก็จะมีการสุ่มใหม่น้อยมากและมันก็รออยู่

/dev/randomสำหรับการเข้ารหัสลับแบบสุ่มอย่างแท้จริงการสุ่มคุณภาพสูง ดังนั้นมันจึงเป็น overkill สำหรับดิสก์ไดรฟ์ที่เขียนทับ การเขียนตั้งแต่/dev/zeroไม่กี่ครั้งก็ถือว่าใช้ได้ หรือคุณสามารถเขียนจาก/dev/urandomซึ่งจะไม่ปิดกั้นและให้ตัวเลขสุ่มหลอกเมื่อมันหมดแบบสุ่มจริง


10
ไม่มี/dev/randomไม่ได้สร้าง "ไบต์สุ่มอย่างแท้จริง" มันสร้างหลอกที่มีคุณภาพสูงกว่า - สุ่มไบต์กว่า/dev/urandomจะ
Keith Thompson

7

ใน Linux / dev / random เป็นไฟล์พิเศษที่ให้บริการตัวเลขสุ่มหลอกคุณภาพสูง การใช้งานนี้รวบรวมเอนโทรปีจากเหตุการณ์ที่เกิดขึ้นจากแป้นพิมพ์เมาส์ดิสก์และระบบขัดจังหวะ (อ้างอิงเอกสารนี้ ) ดังนั้นเมื่อไม่มีเหตุการณ์ดังกล่าวสระเอนโทรปีว่างเปล่าอ่านจาก / dev / สุ่มจะปิดกั้นจนกว่าจะมีการรวบรวมเสียงสิ่งแวดล้อมเพิ่มเติม นี่อธิบายถึงปัญหาของคุณ เพื่อเติมพูลเอนโทรปีคุณสามารถกดปุ่มบนแป้นพิมพ์

ในหมายเหตุอื่น ๆ ตัวสร้างตัวเลขสุ่มอย่างแท้จริงใช้ตัวสร้างหมายเลขสุ่มฮาร์ดแวร์ซึ่งสร้างตัวเลขสุ่มจากกระบวนการทางกายภาพกระบวนการเหล่านี้รวมถึงปรากฏการณ์ทางกล้องจุลทรรศน์ที่สร้างสัญญาณ "เสียง" ระดับต่ำแบบสุ่มทางสถิติเช่นเสียงความร้อนหรือผลกระทบจากโฟโตอิเล็กทริกหรือ ปรากฏการณ์ทางกายภาพอื่น ๆ กระบวนการเหล่านี้ในทางทฤษฎีคาดเดาไม่ได้อย่างสมบูรณ์และการยืนยันทฤษฎีของความไม่แน่นอนที่คาดการณ์จะต้องผ่านการทดสอบการทดลอง

เครื่องกำเนิดเลขสุ่มฮาร์ดแวร์โดยทั่วไปจะประกอบด้วยตัวแปลงสัญญาณเพื่อแปลงบางแง่มุมของปรากฏการณ์ทางกายภาพเป็นสัญญาณไฟฟ้า, เครื่องขยายเสียงและวงจรอิเล็กทรอนิกส์อื่น ๆ เพื่อเพิ่มความกว้างของความผันผวนแบบสุ่มเป็นระดับมหภาคและบางชนิดของอนาล็อกเป็นดิจิตอลแปลง ในการแปลงเอาต์พุตเป็นตัวเลขดิจิตอลมักเป็นเลขฐานสองอย่างง่าย 0 หรือ 1 โดยการสุ่มสัญญาณที่แตกต่างกันแบบสุ่มซ้ำ ๆ จะได้รับชุดตัวเลขสุ่ม

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

การใช้งานบางส่วนของฮาร์ดแวร์ RNG มีการอธิบายในเอกสารเคอร์เนลและข้อมูลเกี่ยวกับอุปกรณ์

คู่กับ / dev / random คือ / dev / urandom ("ปลดล็อค" / ไม่ปิดกั้นแหล่งสุ่ม) ซึ่ง reuses สระว่ายน้ำภายในเพื่อผลิตบิตสุ่มหลอกมากขึ้น ซึ่งหมายความว่าการโทรจะไม่บล็อก แต่ผลลัพธ์อาจมีเอนโทรปีน้อยกว่าการอ่านจาก / dev / random ที่สอดคล้องกัน

ดังนั้นหากเจตนาของคุณไม่ได้สร้าง CSPRNG (ตัวสร้างหมายเลขเทียมที่มีความปลอดภัยเข้ารหัส) คุณควรใช้ / dev / urandom


ไม่/dev/randomจริงๆใช้แหล่งที่มาเหมือนเสียงความร้อน? ความเข้าใจของฉันคือการใช้ข้อมูลจากสถานะระบบที่ค่อนข้างคาดเดาไม่ได้เช่นกิจกรรม I / O และสถานะกระบวนการ ฉันไม่คิดว่าระบบ Linux ส่วนใหญ่จะมีฮาร์ดแวร์ที่สามารถเก็บเสียงความร้อนได้ คุณสามารถอ้างอิงเอกสารเกี่ยวกับเรื่องนี้ได้ไหม?
Keith Thompson

ใช่คุณถูก. ข้อมูลที่ฉันได้กล่าวถึงใช้กับเครื่องกำเนิดหมายเลขสุ่มฮาร์ดแวร์ทั่วไป
Sachin Divekar

ดูเอกสารเกี่ยวกับวิธีการที่จะดำเนินการใน linux ที่เชื่อมโยง มีการกล่าวถึงว่าในสภาพแวดล้อมพีซี LRNG จะรวบรวมเอนโทรปีจากเหตุการณ์ที่เกิดขึ้นจากแป้นพิมพ์เมาส์ดิสก์และระบบขัดจังหวะ ในสภาพแวดล้อมอื่น LRNG รวบรวมเอนโทรปีจากทรัพยากรที่มีอยู่ ตัวอย่างเช่นเราเตอร์ OpenWRT ไม่รวมฮาร์ดดิสก์เมาส์และคีย์บอร์ดดังนั้นจึงไม่สามารถใช้เป็นแหล่งข้อมูลเอนโทรปีได้ ในทางกลับกันเราเตอร์จะรวบรวมเอนโทรปีจากกิจกรรมเครือข่าย
Sachin Divekar

บางทีคุณสามารถปรับปรุงคำตอบของคุณ ฉันไม่เชื่อว่ามันถูกต้องที่จะบอกว่า/dev/randomสร้าง "ตัวเลขสุ่มอย่างแท้จริง"
Keith Thompson

/ dev /บทความสุ่มบน wikipedia พูดว่า, Linux เป็นระบบปฏิบัติการแรกที่ใช้ตัวสร้างตัวเลขสุ่มที่แท้จริงด้วยวิธีนี้ในวรรคแรก
Sachin Divekar

2

โดยไม่ต้องตอบคำถามของคุณ - มีคำตอบที่สมบูรณ์อยู่แล้วที่นี่ - คุณสามารถตรวจสอบการบูตและ Nuke DBANของ Darik ซึ่งเป็นที่ปัดน้ำฝนแบบไลฟ์ไดรฟ์ซีดี


0

เพียงใช้shredคำสั่งที่มาพร้อมกับ coreutils มันใช้ข้อมูลแบบสุ่มในวิธีที่มีประสิทธิภาพ dd เป็นเครื่องมือระดับต่ำและอาจเป็นระดับที่ต่ำเกินไปสำหรับงานนี้ shredจะข้ามส่วนที่ไม่สามารถเขียนได้ของอุปกรณ์ได้อย่างมีประสิทธิภาพเช่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.