ข้ามไปยังเนื้อหาหลัก

เอนโทรปีและความสุ่มในสกุลเงินดิจิทัล: ทำไมจึงสำคัญ

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

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

เอนโทรปีคืออะไร

ในทฤษฎีข้อมูล เอนโทรปีวัดปริมาณความไม่แน่นอนหรือความคาดเดาไม่ได้ในข้อมูล ในการเข้ารหัส เอนโทรปีวัดปริมาณความสุ่มแท้ที่ค่าหนึ่งประกอบด้วย

คีย์ส่วนตัว 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 และคีย์สกุลเงินดิจิทัลใดๆ ที่สร้างขึ้นในช่วงเวลานี้บนระบบที่ได้รับผลกระทบทั้งหมดถูกประนีประนวม

บทเรียนที่เรียน

  1. ไม่เคยไว้วางใจแหล่งเอนโทรปีเดียวโดยไม่มีการตรวจสอบ
  2. ข้อผิดพลาดในการใช้งานเพียงเล็กน้อยอาจลดเอนโทรปีได้อย่างร้ายแรง
  3. ผู้โจมตีใช้ประโยชน์จากความสุ่มที่อ่อนแออย่างแข็งขัน — มันไม่ใช่ทฤษฎี
  4. รหัสที่เปิดต้นทาง ตรวจสอบอย่างมีวิจารณญาณ ถือเป็นสิ่งจำเป็นสำหรับการดำเนินการที่สำคัญต่อเอนโทรปี

แหล่งเอนโทรปีโดยละเอียด

ระบบสายของเอนโทรปีของระบบปฏิบัติการ

ระบบปฏิบัติการสมัยใหม่รักษาระบบสายของเอนโทรปีที่ปอดจากแหล่งหลายแหล่ง:

  • เวลาของการหยุดชั่วคราว — เวลาของการหยุดชั่วคราวของฮาร์ดแวร์ (แป้นพิมพ์ เมาส์ ดิสก์ เครือข่าย) ให้ข้อมูลป้อนเข้าคาดเดาไม่ได้
  • เวลาดิสก์ 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 Tool

SafeSeed Seed Phrase Generator ช่วยให้คุณป้อนเอนโทรปีของคุณเอง (เช่นผลลัพธ์การทอยลูกเต๋า) เพื่อสร้างวลีเมล็ด BIP-39 สิ่งนี้ช่วยให้คุณตรวจสอบแหล่งความสุ่มในขณะที่ยังคงได้รับประโยชน์จากการใช้งาน BIP-39 ที่ถูกต้องของเครื่องมือ ใช้เครื่องมือแบบออฟไลน์เพื่อความปลอดภัยสูงสุด — ดู Offline Key Generation guide ของเรา

การทดสอบและการตรวจสอบความสุ่ม

NIST Statistical Test Suite

NIST SP 800-22 กำหนดแบตเตอรี่ของการทดสอบทางสถิติสำหรับการประเมินเครื่องสร้างตัวเลขสุ่ม:

  • การทดสอบความถี่ — มีจำนวน 0 และ 1 ที่ประมาณเท่ากันหรือไม่
  • การทดสอบความถี่บล็อก — คือบล็อคย่อยของบิตกระจายแบบสม่ำเสมอหรือไม่
  • การทดสอบการเรียก — ลำดับของบิตที่เหมือนกันติดต่อกัน (runs) มีความยาวตามคาดหวังหรือไม่
  • การทดสอบการเรียกที่ยาวที่สุด — เป็นการเรียกที่ยาวที่สุดภายในขีดจำกัดที่คาดหวังหรือไม่
  • การทดสอบลำดับแมทริกซ์ — ลำดับแมทริกซ์ไบนารีเป็นไปตามการแจกแจงที่คาดหวังหรือไม่
  • การทดสอบสเปกตรัม — DFT ของลำดับบิตแสดงสมบัติที่คาดหวังหรือไม่

การทดสอบเหล่านี้สามารถตรวจจับอคติและรูป