วิทยาศาสตร์ยอดนิยม: ตัวเลขสุ่มจริงและตัวเลขสุ่มหลอก
มีเหตุการณ์หลายครั้งที่ผู้ใช้กระเป๋าเงินของแบรนด์ต่าง ๆ สูญเสียเหรียญ ทั้งหมดนี้เป็นเพราะปัญหาเกี่ยวกับฟังก์ชั่นสุ่ม
ความสุ่มเป็นสิ่งสำคัญมาก โดยเฉพาะอย่างยิ่งสำหรับ Bitcoin ซึ่งเป็นสกุลเงินอิเล็กทรอนิกส์เข้ารหัส น่าเสียดายที่ไม่มีการพูดคุยเรื่องการสุ่มในชุมชนมากนักซึ่งทำให้หลายคนขาดความเข้าใจที่ถูกต้อง ดังนั้น วันนี้เราจะมาพูดคุยเกี่ยวกับการสุ่มกับคุณ
เมื่อพูดถึงการสุ่ม มีสองแนวคิดที่ต้องชี้แจง: "ตัวสร้างตัวเลขสุ่มจริง" (TRNG) และตัวสร้างตัวเลขสุ่มหลอก (PRNG)
ฟังก์ชันสุ่มส่วนใหญ่ในโปรแกรมคอมพิวเตอร์และภาษาเป็นเครื่องกำเนิดตัวเลขหลอก และทั้งหมดใช้ "เมล็ด" (เช่น "เวลา") เพื่อสร้างผลลัพธ์ "ดูสุ่ม" โดยอัลกอริทึมบางอย่าง
ไม่ต้องสงสัยเลยว่าตราบใดที่ใครก็ตามรู้อัลกอริธึมและเมล็ดพันธุ์ หรือตัวเลขสุ่มที่สร้างขึ้นมาก่อน ก็เป็นไปได้ที่จะได้รับข้อมูลของลำดับตัวเลขสุ่มถัดไป เนื่องจากความสามารถในการคาดเดาได้ จึงไม่ปลอดภัยด้วยการเข้ารหัส ดังนั้นเราจึงเรียกมันว่า "การสุ่มหลอก" ตัวเลขสุ่มแบบนี้ไม่ใช่ปัญหาใหญ่สำหรับคนร้ายในเกมที่จะวิ่งหนี หากใช้เพื่อสร้างรหัสส่วนตัวของ Bitcoin ก็ไม่ปลอดภัยเกินไป
เรามาพูดถึงตัวสร้างตัวเลขสุ่มที่แท้จริงกัน ใน Wiki ของจีน การนำ "ตัวสร้างตัวเลขสุ่มแบบฮาร์ดแวร์" (HRNG) มาเทียบเคียงกับตัวสร้างตัวเลขสุ่มจริงนั้นไม่ถูกต้องนัก การสุ่มที่แท้จริงในความหมายที่เคร่งครัดอาจมีอยู่ในกลศาสตร์ควอนตัมเท่านั้น ในหมู่พวกเขา สิ่งที่เราต้องการ (หรือต้องการได้) ในปัจจุบันไม่ใช่การสุ่มแบบนี้
เราต้องการหมายเลขสุ่มที่คาดเดาไม่ได้ มีสถิติ และมีการเข้ารหัสอย่างปลอดภัย ตราบเท่าที่เครื่องสร้างหมายเลขสุ่มที่ทำเช่นนี้ได้ก็สามารถเรียกว่าเครื่องสร้างหมายเลขสุ่มที่แท้จริงได้ การสุ่มที่แท้จริงประเภทนี้ไม่จำเป็นต้องได้รับการออกแบบมาเป็นพิเศษสำหรับฮาร์ดแวร์ ตัวสร้างตัวเลขสุ่ม (/dev/random) ในเคอร์เนลของระบบปฏิบัติการ Linux จะรักษากลุ่มเอนโทรปี การเปลี่ยนแปลงความแรงของสัญญาณเครือข่าย ฯลฯ) ทำให้สามารถให้เอนโทรปีข้อมูลสุ่มที่ใหญ่ที่สุดที่เป็นไปได้ ดังนั้นจึงเป็นเครื่องกำเนิดตัวเลขสุ่มจริงคุณภาพสูง
อย่างไรก็ตาม /dev/random กำลังบล็อกอยู่ นั่นคือหากกลุ่มเอนโทรปีว่างเปล่า การดำเนินการอ่านไปยัง /dev/random จะถูกระงับจนกว่าจะรวบรวมเสียงรบกวนรอบข้างได้เพียงพอ
ดังนั้น เมื่อพัฒนาโปรแกรม เราควรใช้ /dev/urandom เป็นสำเนาของ /dev/random จะไม่ปิดกั้น แต่เอนโทรปีของผลลัพธ์อาจน้อยกว่า /dev/random
ตกลง หลังจากทั้งหมดที่กล่าวมา เราควรใช้ตัวสร้างตัวเลขสุ่มแบบใดเพื่อสร้างคีย์ส่วนตัวเมื่อเราพัฒนาแอปพลิเคชัน Bitcoin
คำตอบนั้นง่าย: urandom ใช้ urandom เท่านั้น
อย่าใช้วิธีสุ่มตัวเลขของบริษัทอื่น แม้แต่ไลบรารีความปลอดภัยขั้นสูงบางรายการที่มีฟังก์ชันสุ่มที่อ้างว่า "ปลอดภัยมาก" เนื่องจากเป็นตัวสร้างตัวเลขสุ่มเข้ารหัสทั้งหมดในโหมดผู้ใช้ และ urandom เป็นตัวสร้างตัวเลขสุ่มในโหมดเคอร์เนล เคอร์เนลสามารถเข้าถึงเอนโทรปีของอุปกรณ์ดิบ และเคอร์เนลสามารถมั่นใจได้ว่าจะไม่แชร์สถานะเดียวกันระหว่างแอปพลิเคชัน .
ในอดีต กรณีความล้มเหลวของตัวเลขสุ่มจำนวนนับไม่ถ้วนส่วนใหญ่เกิดขึ้นในตัวสร้างตัวเลขสุ่มในสถานะผู้ใช้ และตัวสร้างตัวเลขสุ่มในสถานะผู้ใช้มักจะขึ้นอยู่กับตัวสร้างตัวเลขสุ่มในสถานะเคอร์เนล (หากคุณไม่พึ่งพามัน จากนั้นความเสี่ยงจะมากขึ้น) ยกเว้นว่ามันอาจทำให้งานพัฒนาบางอย่างของคุณง่ายขึ้น แต่ก็ไม่มีประโยชน์เพิ่มเติมเลย แต่จะเพิ่มความเสี่ยงด้านความปลอดภัยที่อาจเกิดจากการแนะนำรหัสของบุคคลที่สาม
ดังนั้น นักพัฒนาควรใช้ urandom เมื่อต้องการตัวเลขสุ่มที่ปลอดภัยด้วยการเข้ารหัส
สุดท้าย เด็กบางคนถามว่าฮาร์ดแวร์กระเป๋าเงิน BITHD ของคุณสร้างตัวเลขสุ่มจริงหรือไม่
นี่คือคำตอบ: แน่นอน
ชิปของ BITHD มีตัวสร้างหมายเลขสุ่มของฮาร์ดแวร์ ซึ่งจะสร้างหมายเลขสุ่มที่แท้จริงโดยการรับแหล่งที่มาของสัญญาณรบกวน ซึ่งเป็นสิ่งที่คาดเดาไม่ได้และตรวจจับไม่ได้ และเป็นแหล่งสุ่มที่แท้จริง


