เอนโทรปีและความสุ่มในสกุลเงินดิจิทัล: ทำไมจึงสำคัญ
ทุกคีย์ส่วนตัวของสกุลเงินดิจิทัล ทุกวลีเมล็ด และทุกที่อยู่ที่คุณใช้เริ่มต้นด้วยตัวเลขสุ่ม ความปลอดภัยของพอร์ตโฟลิโอสกุลเงินดิจิทัลของคุณอยู่บนสมมติฐานหนึ่ง: ตัวเลขนั้นนั้นคาดเดาไม่ได้อย่างแท้จริง หากเครื่องสร้างตัวเลขสุ่มที่สร้างคีย์ของคุณมีความอ่อนแอ มีความลำเอียง หรือคาดเดาได้ เงินของคุณสามารถถูกขโมยได้ — ไม่ใช่โดยการทำลายการเข้ารหัส แต่โดยการเดาคีย์
คำแนะนำนี้อธิบายความหมายของเอนโทรปีในบริบทการเข้ารหัส วิธีการทำงานของเครื่องสร้างตัวเลขสุ่ม สิ่งที่ผิดพลาดไปในประวัติศาสตร์เมื่อความสุ่มล้มเหลว และวิธีการตรวจสอบว่าการสร้างคีย์ของคุณดีหรือไม่
เอนโทรปีคืออะไร
ในทฤษฎีข้อมูล เอนโทรปีวัดปริมาณความไม่แน่นอนหรือความคาดเดาไม่ได้ในข้อมูล ในการเข้ารหัส เอนโทรปีวัดปริมาณความสุ่มแท้ที่ค่าหนึ่งประกอบด้วย
คีย์ส่วนตัว 256 บิตควรมีเอนโทรปี 256 บิต — ซึ่งหมายความว่าผู้โจมตีต้องลองเดา 2^255 ครั้งโดยเฉลี่ยเพื่อค้นหามัน (ครึ่งหนึ่งของพื้นที่ค้นหา โดยเฉลี่ย) หากคีย์ถูกสร้างขึ้นด้วยเอนโทรปีจริงเพียง 32 บิต (เพราะ RNG มีข้อบกพร่อง) ผู้โจมตีต้องเดาเพียงประมาณ 2^31 ครั้ง — ประมาณ 2 พันล้าน — ซึ่งคอมพิวเตอร์สมัยใหม่สามารถทำได้ในเวลาเพียงไม่กี่นาที
การวัดเอนโทรปี
เอนโทรปีวัดเป็นบิต เอนโทรปีของตัวแปรสุ่ม X คือ:
H(X) = -sum(p(x) * log2(p(x))) สำหรับค่าที่เป็นไปได้ทั้งหมด x
สำหรับตัวเลข 256 บิตที่มีการแจกแจงแบบสม่ำเสมอ:
- แต่ละบิตมีความน่าจะเป็น 0.5 ที่จะเป็น 0 หรือ 1
- เอนโทรปี = 256 บิต (สูงสุดสำหรับขนาดนี้)
สำหรับเครื่องสร้างที่มีความลำเอียงโดยแต่ละบิตมีความน่าจะเป็น 0.7 ที่จะเป็น 1:
- เอนโทรปีต่อบิต = -(0.7 * log2(0.7) + 0.3 * log2(0.3)) = 0.881 บิต
- เอนโทรปีทั้งหมดสำหรับ 256 บิต = 225.5 บิต (น้อยกว่าอุดมคติ 11.9%)
แม้กระทั่งความลำเอียงเล็กน้อยก็สะสมไปตามบิตจำนวนมากและสามารถลดระดับความปลอดภัยที่มีประสิทธิผลได้อย่างมาก
เอนโทรปีในบริบท BIP-39
| ความยาววลี | เอนโทรปี | ระดับความปลอดภัย | Brute-Force ที่ 10^12/sec |
|---|---|---|---|
| 12 คำ | 128 บิต | 128-bit | ~10^19 ปี |
| 15 คำ | 160 บิต | 160-bit | ~10^28 ปี |
| 18 คำ | 192 บิต | 192-bit | ~10^38 ปี |
| 24 คำ | 256 บิต | 256-bit | ~10^57 ปี |
ตัวเลขเหล่านี้สมมติว่าเอนโทรปีกระจายแบบสม่ำเสมออย่างแท้จริง หากเครื่องสร้างตัวเลขสุ่มมีข้อบกพร่อง ระดับความปลอดภัยที่แท้จริงอาจต่ำกว่ามากมาย
ประเภทของเครื่องสร้างตัวเลขสุ่ม
เครื่องสร้างตัวเลขสุ่มแท้ (TRNG)
TRNGs สุ่มตัวอย่างปรากฏการณ์ทางกายภาพที่คาดเดาไม่ได้โดยธรรมชาติในระดับควอนตัม:
- เสียงความร้อน — ความผันผวนแรงดันไฟฟ้าแบบสุ่มในตัวต้านทานเนื่องจากการเคลื่อนที่ด้วยความร้อนของอิเล็กตรอน
- เสียงช็อต — ความผันผวนของกระแสแบบสุ่มเนื่องจากลักษณะที่ไม่ต่อเนื่องของการไหลของอิเล็กตรอน
- การสลายตัวของกัมมันตรังสี — เวลาของเหตุการณ์การสลายตัวแต่ละครั้งคาดเดาไม่ได้โดยพื้นฐาน
- เสียงในอากาศ — ความแปรปรวนของสัญญาณวิทยุจาก闪电และกระบวนการอื่นๆ ในบรรยากาศ
กระเป๋าเงินฮาร์ดแวร์เช่น Ledger และ Trezor ใช้ TRNGs บนชิป ซึ่งสุ่มตัวอย่างแหล่งเสียงทางกายภาพและปรับเงื่อนไขผลลัพธ์ผ่านการฟอกขาว (whitening) และการทดสอบสุขภาพ
ข้อดี: ความสุ่มที่แท้จริงจากฟิสิกส์; ไม่มีสถานะกำหนดที่จะทำนายได้ ข้อเสีย: ขึ้นอยู่กับฮาร์ดแวร์; อาจล้มเหลวอย่างเงียบ ๆ หากแหล่งเสียงลดลง; ปริมาณงานอาจมีจำกัด
เครื่องสร้างตัวเลขเทียมสุ่มที่ปลอดภัยในการเข้ารหัส (CSPRNG)
CSPRNG เป็นอัลกอริทึมที่กำหนดได้ซึ่งสร้างผลลัพธ์ที่แยกไม่ออกจากความสุ่มแท้ เมื่อมีเมล็ดพันธุ์ที่สุ่มมากเพียงพอ:
- Linux:
/dev/urandom(ใช้ ChaCha20 หรืออัลกอริทึมรหัสที่คล้ายกัน ซึ่งมีเมล็ดจากเอนโทรปีฮาร์ดแวร์) - macOS:
/dev/urandom(arc4random มีเมล็ดจากเอนโทรปีฮาร์ดแวร์) - Windows:
BCryptGenRandom(ผู้ให้บริการ CNG) - เว็บเบราวเซอร์:
crypto.getRandomValues()(ปล่อยให้ OS CSPRNG) - Python:
os.urandom()หรือโมดูลsecrets - Node.js:
crypto.randomBytes()
ข้อดี: รวดเร็ว; อัลกอริทึมที่ศึกษาอย่างดี; มีอยู่บนแพลตฟอร์มทั้งหมด ข้อเสีย: แข็งแกร่งเท่ากับเอนโทรปีเมล็ดพันธุ์เริ่มต้น; กำหนดได้ — หากทราบสถานะภายใน ผลลัพธ์ในอนาคตทั้งหมดจะสามารถทำนายได้
PRNGs ที่ไม่ปลอดภัยในการเข้ารหัส (ห้ามใช้สำหรับคีย์)
ฟังก์ชันสุ่มของหลักสูตรมาตรฐานในภาษาการเขียนโปรแกรมส่วนใหญ่ออกแบบสำหรับการจำลองทางสถิติ ไม่ใช่การเข้ารหัส:
- Python:
random.random()(Mersenne Twister — กำหนดได้ สถานะสามารถกู้คืนได้จาก 624 ผลลัพธ์) - JavaScript:
Math.random()(xorshift128+ ใน V8 — คาดเดาได้) - C:
rand()(linear congruential generator — คาดเดาได้อย่างง่ายดาย) - Java:
java.util.Random(linear congruential — คาดเดาได้)
เครื่องสร้างเหล่านี้มีเอนโทรปีต่ำ ช่วงเวลาสั้น และสถานะคาดเดาได้ การใช้พวกเขาสำหรับการสร้างคีย์เทียบเท่ากับการไม่ใช้ความสุ่มเลย ไม่เคยสร้างคีย์ส่วนตัวหรือวลีเมล็ดด้วยฟังก์ชันเหล่านี้
ความล้มเหลวในการสร้างความสุ่มในประวัติศาสตร์
ข้อบกพร่อง Android SecureRandom (2013)
ในสิงหาคม 2013 พบข้อบกพร่องที่มีความสำคัญต่อการนอก ในการใช้งาน SecureRandom ของ Android Java PRNG ไม่ได้รับเมล็ดอย่างถูกต้องบนอุปกรณ์ Android บางเครื่อง ทำให้แอปพลิเคชันกระเป๋าเงิน Bitcoin หลายตัวสร้างคีย์ส่วนตัวจากสถานะที่คาดเดาได้ ผู้โจมตีใช้ประโยชน์จากสิ่งนี้เพื่อขโมย Bitcoin ประมาณ 55 บิต ข้อบกพร่องส่งผลต่อการสร้าง nonce ลายเซ็นชนิด ECDSA — การใช้ nonce เดียวกันสองครั้งอนุญาตให้คำนวณคีย์ส่วนตัวจากลายเซ็นสองลายเซ็น
"Blockchain Bandit" (2019)
นักวิจัยด้านความปลอดภัย Adrian Bednarek ค้นพบว่ากระเป๋าเงินถูกสร้างขึ้นด้วยคีย์ส่วนตัวที่อ่อนแอเล็กน้อย — คีย์เช่น 1, 2, 3 หรือคำจากพจนานุกรมแบบแฮชครั้งเดียว ผู้โจมตีได้ทำการสอบสวนอย่างจำนองเพื่อพิจารณาคีย์ที่มีเอนโทรปีต่ำและตรวจสอบว่าพวกเขาถือเงินหรือไม่ โดยสะสมไว้มากกว่า 45,000 ETH ผู้ค้นหาของ Bandit เพียงแค่คำนวณคีย์เอนโทรปีต่ำและตรวจสอบว่าพวกเขาถือเงินหรือไม่
ตัวอย่างคีย์ที่ถูกล้านหมด:
- คีย์ส่วนตัว
0x0000000000000000000000000000000000000000000000000000000000000001(หมายเลข 1) - คีย์ส่วนตัวที่มาจากรหัสผ่านและวลีทั่วไป
ความเสี่ยง Milk Sad (2023)
คำสั่ง seed ของเครื่องมือ libbitcoin-explorer (bx) ใช้ Mersenne Twister ที่มีเมล็ดเพียง 32 บิตจากเวลาระบบ ซึ่งหมายความว่าคีย์ทั้งหมดที่สร้างด้วยเครื่องมือนี้มีเอนโทรปีมากที่สุด 32 บิต — ประมาณ 4.3 พันล้านความเป็นไปได้ ผู้โจมตีใช้ brute-force กับคีย์เหล่านี้และขโมยเงิน
ข้อบกพร่องคีย์อ่อน Debian OpenSSL (2008)
ผู้ดูแล Debian โดยไม่ตั้งใจได้ลบบรรทัดรหัสที่ให้เอนโทรปีแก่เครื่องสร้างตัวเลขสุ่มของ OpenSSL เป็นเวลาสองปี (2006-2008) ทุกคีย์การเข้ารหัสที่สร้างขึ้นบนระบบ Debian และ Ubuntu มีเอนโทรปีเพียง 15 บิตจาก ID กระบวนการ ทำให้ได้คีย์ที่ไม่ซ้ำกันมากที่สุด 32,767 คีย์ คีย์ SSH ใบรับรอง SSL และคีย์สกุลเงินดิจิทัลใดๆ ที่สร้างขึ้นในช่วงเวลานี้บนระบบที่ได้รับผลกระทบทั้งหมดถูกประนีประนวม
บทเรียนที่เรียน
- ไม่เคยไว้วางใจแหล่งเอนโทรปีเดียวโดยไม่มีการตรวจสอบ
- ข้อผิดพลาดในการใช้งานเพียงเล็กน้อยอาจลดเอนโทรปีได้อย่างร้ายแรง
- ผู้โจมตีใช้ประโยชน์จากความสุ่มที่อ่อนแออย่างแข็งขัน — มันไม่ใช่ทฤษฎี
- รหัสที่เปิดต้นทาง ตรวจสอบอย่างมีวิจารณญาณ ถือเป็นสิ่งจำเป็นสำหรับการดำเนินการที่สำคัญต่อเอนโทรปี
แหล่งเอนโทรปีโดยละเอียด
ระบบสายของเอนโทรปีของระบบปฏิบัติการ
ระบบปฏิบัติการสมัยใหม่รักษาระบบสายของเอนโทรปีที่ปอดจากแหล่งหลายแหล่ง:
- เวลาของการหยุดชั่วคราว — เวลาของการหยุดชั่วคราวของฮาร์ดแวร์ (แป้นพิมพ์ เมาส์ ดิสก์ เครือข่าย) ให้ข้อมูลป้อนเข้าคาดเดาไม่ได้
- เวลาดิสก์ I/O — เวลาที่แน่นอนของการดำเนินการอ่าน/เขียนดิสก์จะแตกต่างกันไปขึ้นอยู่กับปัจจัยทางกลและอิเล็กทรอนิกส์
- ฮาร์ดแวร์ RNG — CPU สมัยใหม่ (Intel RDRAND, AMD) รวมเครื่องสร้างตัวเลขสุ่มบนชิป
- เอนโทรปีเวลาบูต — ระบบบางระบบบันทึกเอนโทรปีข้ามการเริ่มต้นใหม่ (
/var/lib/systemd/random-seedบน Linux)
OS ผสมแหล่งเหล่านี้เข้าในระบบสายของเอนโทรปีโดยใช้ดั้งเดิมการเข้ารหัส จากนั้นจึงใช้ระบบสายเพื่อเมล็ด CSPRNG ของมัน ในเคอร์เนล Linux สมัยใหม่ (5.18+) /dev/urandom จะบล็อกจนกว่าจะรวบรวมเอนโทรปีเพียงพอเมื่อบูต จากนั้นจึงไม่เคยบล็อกอีก
เอนโทรปีของเบราวเซอร์ (crypto.getRandomValues)
เมื่อคุณใช้เครื่องมือบนเว็บเช่น SafeSeed Generator API crypto.getRandomValues() ของเบราวเซอร์จะถูกใช้ สิ่งนี้ปล่อยให้ CSPRNG ของระบบปฏิบัติการ:
- Chrome: มอบหมายให้ OS CSPRNG (BoringSSL)
- Firefox: มอบหมายให้ OS CSPRNG (NSS)
- Safari: มอบหมายให้ OS CSPRNG (CommonCrypto)
สิ่งนี้ถือว่าปลอดภัยสำหรับการสร้างคีย์ โดยให้ OS ที่เป็นพื้นฐานปลอดภัย ข้อกังวลหลักคือการทำงานในสภาพแวดล้อมที่ CSPRNG ของ OS อาจถูกบุกรุก (เช่น เครื่องเสมือนที่มีแหล่งเอนโทรปีไม่เพียงพอ หรือระบบปฏิบัติการที่บุกรุก)
เอนโทรปีของกระเป๋าเงินฮาร์ดแวร์
กระเป๋าเงินฮาร์ดแวร์ใช้เครื่องสร้างตัวเลขสุ่มแท้บนชิป:
- Ledger (Secure Element ST33): ใช้ TRNG ของชิป ST33 ซึ่งสุ่มตัวอย่างเสียง ผลลัพธ์ผ่านการทดสอบสุขภาพ NIST SP 800-90B ก่อนใช้
- Trezor: ใช้ STM32 chip's hardware RNG Trezor ยังสนับสนุนการผสมในเอนโทรปีที่ผู้ใช้ให้ (dice roll entropy)
- Coldcard: ใช้ ATECC608A secure element's TRNG บวก MCU's hardware RNG ของ ผสมทั้งแหล่งที่มา
เอนโทรปีการทอยลูกเต๋า
การทอยลูกเต๋าด้วยตนเองเป็นวิธีการสร้างเอนโทรปีที่โปร่งใสที่สุด:
- ลูกเต๋าหกด้านที่ยุติธรรมสร้าง log2(6) = 2.585 บิตของเอนโทรปีต่อการทอย
- 100 ครั้งสร้างเอนโทรปีประมาณ 258.5 บิต — เพียงพอสำหรับวลีเมล็ด 24 คำ
- ผู้ใช้สามารถตรวจสอบความสุ่มแบบกายภาพได้ (ลูกเต๋าที่ยุติธรรม การทอยที่ยุติธรรม ไม่มีการจัดการ)
ตรวจสอบความยุติธรรมของลูกเต๋า:
- ใช้ลูกเต๋าความแม่นยำของคาสิโน (ขอบเสียบ ไม่โค้งมน)
- ทอยบนพื้นผิวแข็งเรียบด้วยการหยุดหลัง
- อย่า "วาง" ลูกเต๋า — ปล่อยให้พวกเขาหมุนอย่างอิสระ
- บันทึกผลลัพธ์แต่ละครั้งทันทีและตามลำดับ
SafeSeed Seed Phrase Generator ช่วยให้คุณป้อนเอนโทรปีของคุณเอง (เช่นผลลัพธ์การทอยลูกเต๋า) เพื่อสร้างวลีเมล็ด BIP-39 สิ่งนี้ช่วยให้คุณตรวจสอบแหล่งความสุ่มในขณะที่ยังคงได้รับประโยชน์จากการใช้งาน BIP-39 ที่ถูกต้องของเครื่องมือ ใช้เครื่องมือแบบออฟไลน์เพื่อความปลอดภัยสูงสุด — ดู Offline Key Generation guide ของเรา
การทดสอบและการตรวจสอบความสุ่ม
NIST Statistical Test Suite
NIST SP 800-22 กำหนดแบตเตอรี่ของการทดสอบทางสถิติสำหรับการประเมินเครื่องสร้างตัวเลขสุ่ม:
- การทดสอบความถี่ — มีจำนวน 0 และ 1 ที่ประมาณเท่ากันหรือไม่
- การทดสอบความถี่บล็อก — คือบล็อคย่อยของบิตกระจายแบบสม่ำเสมอหรือไม่
- การทดสอบการเรียก — ลำดับของบิตที่เหมือนกันติดต่อกัน (runs) มีความยาวตามคาดหวังหรือไม่
- การทดสอบการเรียกที่ยาวที่สุด — เป็นการเรียกที่ยาวที่สุดภายในขีดจำกัดที่คาดหวังหรือไม่
- การทดสอบลำดับแมทริกซ์ — ลำดับแมทริกซ์ไบนารีเป็นไปตามการแจกแจงที่คาดหวังหรือไม่
- การทดสอบสเปกตรัม — DFT ของลำดับบิตแสดงสมบัติที่คาดหวังหรือไม่
การทดสอบเหล่านี้สามารถตรวจจับอคติและรูป