การใช้ urandom ในการสร้างสตริงแบบสุ่มต้องใช้ตลอดไป


2

เวลาที่ใช้ในการสร้างสตริงความยาว 10 โดยใช้คำสั่งต่อไปนี้เป็นที่ยอมรับ

cat /dev/urandom | strings -n 10 | head -n 1

ในขณะที่การสร้างสตริงที่มีความยาว 255 จะใช้เวลาตลอดไป

cat /dev/urandom | strings -n 255 | head -n 1

ฉันลองด้วยความยาวอื่น ๆ เช่น 30 มันนานกว่าที่ใช้กับ 10 ฉันเปรียบเทียบเวลาที่ใช้ไปหลายต่อหลายครั้ง ทำไมนี้

คำตอบ:


3

จากman 1 strings:

สำหรับแต่ละไฟล์ที่ได้รับ GNU stringsจะพิมพ์ลำดับอักขระที่พิมพ์ได้ที่มีความยาวอย่างน้อย 4 ตัวอักษร (หรือตัวเลขที่กำหนดด้วยตัวเลือกด้านล่าง) และตามด้วยอักขระที่ไม่สามารถพิมพ์ได้

อัตราต่อรองที่stringsพบกับอักขระที่พิมพ์ได้255 ตัวติดต่อกันในกระแสข้อมูลแบบสุ่มคืออะไร ต่ำเว้นแต่คุณจะรอนานพอ

คำสั่งด้านล่างไม่จำเป็นต้องมีอักขระที่พิมพ์ได้ต่อเนื่องในอินพุตสตรีม มันกำจัดตัวละครที่ไม่สามารถพิมพ์ได้

< /dev/urandom tr -dc '[:print:]' | head -c 255

หมายเหตุ: GNU trทำงานครั้งละหนึ่งไบต์ (ไม่มีแนวคิดของอักขระหลายไบต์) ดังนั้น GNU head -cจะนับจำนวนไบต์ ดังนั้น:

  • ด้วยเครื่องมือ GNU คุณจะไม่ได้รับอักขระที่ไม่ใช่ ASCII ที่พิมพ์ได้Łจากคำสั่งด้านบน
  • ด้วยการนำไปใช้ที่ไม่ใช่ของ GNU tr(เปรียบเทียบคำตอบนี้ ) คุณอาจได้รับอักขระน้อยกว่า 255 ตัวในขนาด 255 ไบต์;
  • ด้วยการนำไปใช้ที่ไม่ใช่ของ GNU ของtrอักขระตัวสุดท้ายอาจไม่ถูกต้อง สิ่งนี้จะเกิดขึ้นหากheadตัดสตรีมที่อยู่ตรงกลางของอักขระหลายไบต์

ฉันคิดว่าจะstringsกรองตัวอักษรที่พิมพ์ได้ แต่มันคาดหวังว่าจะมีคนติดต่อกันหรือไม่?
Tiina

โปรดอธิบายสิ่งที่อยู่<ใน< /dev/urandom นั้นด้วย :)
Tiina

@Tiina มันเหมือนกับcat /dev/urandom | tr -dc '[:print:]' | head -c 255
Alex

@Tiina <เป็นการเปลี่ยนเส้นทาง ฉันจะหลีกเลี่ยงการใช้งานไร้ประโยชน์ catการเปลี่ยนเส้นทางนี้อาจหรือไม่อาจถูกวางไว้ที่จุดเริ่มต้นของบรรทัด (อธิบายที่นี่ )
Kamil Maciorowski

1
@Tiina - stringsตัวกรองสำหรับสตริงของอักขระที่พิมพ์ได้ไม่ใช่อักขระที่พิมพ์ได้แต่ละตัว -nพารามิเตอร์กำหนดระยะเวลาขั้นต่ำสำหรับแต่ละสายและสายสั้น ๆ จะถูกละเลย
Dave Sherohman

1

หากคุณกำลังมองหา "randomness" จำนวนมากอย่างรวดเร็วคุณอาจพิจารณาว่าไม่ได้ใช้/dev/urandomโดยตรง แต่ควรใช้อุปกรณ์ dm-crypt ธรรมดาพร้อมด้วยปุ่มสุ่ม

มันสมบูรณ์แบบสำหรับการเขียนทับอุปกรณ์ แต่การรวมเข้ากับไฟล์ความยาวคงที่คุณสามารถรับความยาวคงที่ของข้อมูลแบบสุ่มโดยไม่ต้องรอ/dev/urandomเลย

(แม้ว่าปัญหาหลักของคุณดูเหมือนจะรออักขระต่อเนื่องอยู่stringsแต่สิ่งนี้อาจมีประโยชน์ & รวดเร็วกว่าในการแก้ "ปัญหาหัวเรื่องของคุณ")

นี่คือส่วนที่เกี่ยวข้องจากคำถามที่พบบ่อยของ cryptsetup :

2.19 ฉันจะล้างอุปกรณ์ด้วยการสุ่มระดับ crypto ได้อย่างไร?

คำแนะนำทั่วไปหากคุณไม่ต้องการเพียงแค่ใช้ศูนย์การลบคือการใช้สิ่งที่ต้องการ

cat /dev/urandom >  <taget-device>

นั่นช้ามากและเจ็บปวดที่ 10-20MB / s บนคอมพิวเตอร์ที่เร็ว การใช้ cryptsetup และอุปกรณ์ dm-crypt ธรรมดาที่มีปุ่มสุ่มมันเร็วกว่ามากและให้ความปลอดภัยในระดับเดียวกัน ค่าเริ่มต้นค่อนข้างเพียงพอ

สำหรับการตั้งค่าอุปกรณ์ให้ทำดังต่อไปนี้:

cryptsetup open --type plain -d /dev/urandom /dev/<block-device> to_be_wiped

นี้แมปคอนเทนเนอร์เป็นธรรมดาภายใต้ / dev / mapper / to_be_wiped ด้วยรหัสผ่านแบบสุ่ม สำหรับการเช็ดจริงคุณมีหลายตัวเลือก การเช็ดอย่างง่ายโดยไม่มีตัวบ่งชี้ความคืบหน้า:

cat /dev/zero > /dev/mapper/to_be_wiped

ความคืบหน้าตัวบ่งชี้โดย dd_rescue:

dd_rescue -w / dev / ศูนย์ / dev / mapper / to_be_wiped

ตัวบ่งชี้ความก้าวหน้าโดยเครื่องวัดกระแส "wcs" ของฉัน (หาได้จาก http://www.tansi.org/tools/index.html ):

cat /dev/zero | wcs > /dev/mapper/to_be_wiped

หรือใช้ "dd" แบบธรรมดาซึ่งให้ความคืบหน้าแก่คุณเมื่อส่ง SIGUSR1 ดูหน้า dd man

ลบการแมปท้ายแล้วคุณทำเสร็จแล้ว


ดังนั้นการสร้างไฟล์ความยาวคงที่คือ 10M ซึ่งมีชื่อว่า 10

fallocate -l 10M 10

ตั้งค่า dm-crypt ธรรมดาที่ชื่อ 10 /dev/mapper/crypt10

cryptsetup -v open --type plain -d /dev/urandom 10 crypt10

ตอนนี้ "เขียนทับ" 10 ด้วยการสุ่มระดับ crypto (พร้อมdd) & ปิดการทำแผนที่

dd if=/dev/zero of=/dev/mapper/crypt10
cryptsetup -v close crypt10

ตอนนี้คุณมีข้อมูลสุ่ม 10 ไฟล์ในไฟล์ 10 ที่จะเล่นหรือลบอักขระที่ไม่สามารถพิมพ์ได้ทั้งหมดโดยใช้คำตอบของ Kamil: "แปล" ไฟล์ทั้งหมดเป็นไฟล์ที่พิมพ์ได้ซึ่งชื่อ 10-printable จะเป็น

tr -dc '[:print:]' < 10  > 10-printable

เหลือประมาณ 3.8M ของข้อมูลที่พิมพ์ได้ในการพิมพ์ 10 ครั้ง

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