ไทย

เครื่องมือสำหรับนักพัฒนา · ตัวสร้าง UUID

crypto.getRandomValues เปลี่ยน 16 ไบต์แบบสุ่มให้เป็น v4 UUID ได้อย่างไร

· มันทำงานอย่างไร

uuid การเข้ารหัส เบราว์เซอร์-apis

ไบต์สุ่มสิบหกไบต์พร้อมฟิลด์เวอร์ชันและบิตตัวแปรที่เน้นไว้
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

เวอร์ชัน 4 UUID คือ 16 bytes จากตัวสร้างที่ปลอดภัยด้วยการเข้ารหัสซึ่งมีการเขียนทับหกบิต โพสต์นี้เดินไบต์จากการเรียก Web Crypto ไปยังสตริงอักขระ 36 ที่คุ้นเคย

ID ที่คุณต้องการก่อนที่เซิร์ฟเวอร์จะตอบ — เหตุใดการสร้างฝั่งไคลเอ็นต์จึงเกิดขึ้นในรูปแบบออฟไลน์ก่อน UI ในแง่ดี และการนำเข้าเป็นชุด

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

สิ่งที่ crypto.getRandomValues ทำได้จริง — กรอกอาร์เรย์ที่พิมพ์จากแหล่งเอนโทรปีของระบบปฏิบัติการ ไม่ใช่จากสูตร JavaScript

crypto.getRandomValues เติม Uint8Array ด้วย 16 bytes จากตัวสร้างแบบสุ่มที่ปลอดภัยด้วยการเข้ารหัสของแพลตฟอร์มเบราว์เซอร์ ไม่ได้รับค่าจาก Date.now() หรือ Math.random() ระบบปฏิบัติการและเบราว์เซอร์ใช้แหล่งเอนโทรปีพื้นฐาน ดังนั้นโค้ด JavaScript จะได้รับไบต์แทนที่จะใช้สูตรตัวเลขสุ่มเอง ToolAcre ปฏิเสธที่จะสร้างตัวระบุหากไม่มีแหล่งที่มาที่ปลอดภัย

การเขียนทับไบต์ 6 และไบต์ 8 — วิธีที่เวอร์ชัน nibble กลายเป็น 4 และบิตตัวแปรกลายเป็น 10xx และเหตุใดจึงสูญเสียเพียงหกบิตเท่านั้น

RFC 9562 อธิบายเวอร์ชัน nibble และฟิลด์ตัวแปร เริ่มต้นด้วยไบต์สุ่มสิบหกไบต์ ตั้งค่าไบต์สูงสี่บิต 6 เป็นไบนารี 0100 (เวอร์ชัน 4) และตั้งค่าไบต์สองบิตบนสุด 8 เป็น 10 (ตัวแปรมาตรฐาน) การใช้งานใช้ (byte6 & 0x0f) | 0x40 และ (ไบต์ 8 และ 0x3f) | 0x80. หกบิตถูกเขียนทับ โดยเหลือ 122 บิตสุ่มไว้ภายใต้รูปแบบ UUIDv4 บิตคงที่เหล่านั้นไม่ได้ทำให้ไบต์ที่เหลือสุ่มน้อยลง

จากไบต์ถึง 8-4-4-4-12 - การเข้ารหัสฐานสิบหก เอาต์พุตตัวพิมพ์เล็ก และการวางยัติภังค์ตามที่มาตรฐานกำหนด

เข้ารหัสแต่ละไบต์เป็นอักขระฐานสิบหกสองตัวพอดี โดยมีศูนย์นำหน้าเมื่อจำเป็น ใส่เครื่องหมายขีดกลางหลัง 4, 6, 8 และ 10 bytesทำให้เกิดความคุ้นเคย 8-4-4-4-12 กลุ่มอักขระเลขฐานสิบหก สตริง v4 ที่ถูกต้องมี 4 ที่จุดเริ่มต้นของกลุ่มที่สามและหนึ่งในนั้น 8, 9, a หรือ b ที่จุดเริ่มต้นของตำแหน่งที่สี่ การจัดรูปแบบไม่เพิ่มเอนโทรปี มันสร้างแค่สิ่งที่อยู่ข้างใต้เท่านั้น 128-ค่าบิตสามารถทำงานร่วมกับเครื่องมือที่คาดหวังได้ UUID แบบฟอร์มข้อความ

ตัวอย่างการทำงาน - บัฟเฟอร์ 16 ไบต์หนึ่งตัวที่ติดตามผ่านการมาสก์และการจัดรูปแบบไปยังสตริง UUID สุดท้าย

ติดตามไบต์ภาพประกอบ 00 11 22 33 44 55 F6 77 38 99 AA BB CC DD EE FF การปิดบัง F6 ที่ไบต์ 6 สร้าง 46; การปิดบัง 38 ที่ไบต์ 8 สร้าง B8 หลังจากจัดรูปแบบเลขฐานสิบหกตัวพิมพ์เล็กและขีดกลาง ผลลัพธ์จะเป็น 00112233-4455-4677-b899-aabbccddeeff นี่เป็นตัวอย่างการสอนที่จงใจแก้ไข ไม่ใช่ตัวระบุเพื่อนำมาใช้ซ้ำในการผลิต สร้างวัตถุใหม่สำหรับวัตถุจริงแต่ละรายการ และเปรียบเทียบเวอร์ชันและตำแหน่งตัวแปรด้วยตัวคุณเอง

crypto.randomUUID() เป็นทางลัดแบบโทรครั้งเดียว - วิธีที่ใหม่กว่านี้ทำอะไรให้คุณได้บ้าง และที่ใดที่ไม่สามารถใช้งานได้

บนต้นทางที่ปลอดภัย crypto.randomUUID() ดำเนินการสร้างและจัดรูปแบบ v4 ในการเรียกครั้งเดียว ToolAcre ใช้เมื่อพร้อมใช้งาน มิฉะนั้นจะย้อนกลับไปที่ getRandomValues ​​ด้วยการดำเนินการบิตที่ชัดเจนด้านบน ความพร้อมใช้งานของเบราว์เซอร์แตกต่างกันไปตามบริบท: RandomUUID ถูกจำกัดไว้เฉพาะบริบทที่ปลอดภัย ในขณะที่ getRandomValues ​​อาจยังคงอยู่ในหน้า HTTP LAN ไม่มีสาขาใดที่กลับไป Math.random เพียงเพื่อให้ปุ่มใช้งานได้

สิ่งนี้ไม่ครอบคลุมถึงเวอร์ชันตามเวลา (v1, v7) และตามชื่อ (v3, v5) ซึ่งต้องการอินพุตที่แตกต่างจากไบต์สุ่ม

กลไกนี้ไม่ได้อธิบายตัวระบุ v1 หรือ v7 ตามเวลา ตัวระบุ v3/v5 ตามชื่อ หรือโครงร่าง v8 แบบทดลอง UUID แบบสุ่มมีความน่าจะเป็นในการชนกันที่ต่ำมากโดยมีการสุ่มเสียง ไม่ใช่ความเป็นไปไม่ได้ทางคณิตศาสตร์ที่แน่นอนของการชนกัน ไม่ควรใช้ v4 UUID เพียงอย่างเดียวเป็นการตรวจสอบการควบคุมการเข้าถึงหรือโทเค็นการรีเซ็ตรหัสผ่าน โดยไม่พิจารณาถึงความลับ อายุการใช้งาน และการอนุญาตโดยแยกจากกัน

ประเด็นสำคัญ: การสุ่มที่ปลอดภัยเป็นงานทั้งหมด — ตัวสร้าง ToolAcre UUID ดึงมาจากเบราว์เซอร์เดียวกัน CSPRNG ดังนั้นสิ่งที่คุณคัดลอกคือสิ่งที่โค้ดของคุณจะสร้าง

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