เครื่องมือรหัสผ่าน กลับไปยังตัวสร้าง

คู่มือความปลอดภัย

ทำไม Math.random ถึงไม่ปลอดภัยสำหรับรหัสผ่าน

เรียนรู้ว่าเหตุใด Math.random จึงเหมาะสำหรับเอฟเฟกต์ UI แต่ไม่เหมาะสำหรับรหัสผ่าน รหัสรีเซ็ต โทเค็น หรือความลับอื่นๆ ที่เกี่ยวข้องกับความปลอดภัย

สรุป

Math.random() เป็นฟังก์ชันสุ่มเทียมทั่วไปของ JavaScript มีประโยชน์สำหรับแอนิเมชัน พฤติกรรม UI แบบสุ่ม ตัวอย่าง เกม และการจำลอง แต่ไม่ได้ถูกออกแบบมาเพื่อความปลอดภัยทางเข้ารหัส และไม่ควรใช้ในการสร้างรหัสผ่าน รหัสรีเซ็ต ความลับของ API คีย์เซ็น หรือโทเค็นกู้คืน

ปัญหา

เครื่องมือสร้างรหัสผ่านต้องการความไม่สามารถคาดเดาได้ต่อผู้โจมตี ไม่ใช่แค่ค่าที่ดูแตกต่างสำหรับผู้ใช้ Math.random() ไม่ได้ให้การรับประกันความปลอดภัยทางเข้ารหัสตามมาตรฐานเบราว์เซอร์ และการนำไปใช้อาจแตกต่างกันไปในแต่ละเอนจิน

ตัวเลือกที่ปลอดภัยกว่าในเบราว์เซอร์

เบราว์เซอร์สมัยใหม่มี crypto.getRandomValues() ผ่าน Web Crypto API PwdGen ใช้อินเทอร์เฟซนั้นและการสุ่มตัวอย่างแบบปฏิเสธ (rejection sampling) ซึ่งหลีกเลี่ยงการเลือกอักขระที่มีอคติ หาก API นั้นไม่พร้อมใช้งาน พฤติกรรมที่ปลอดภัยคือหยุดการสร้างและอธิบายข้อกำหนดด้านความเข้ากันได้

วิธีตรวจสอบเครื่องมือสร้างรหัสผ่าน

ค้นหาในซอร์สโค้ดสำหรับ Math.random เครื่องมือสร้างรหัสผ่านที่จริงจังไม่ควรใช้มันสำหรับอักขระรหัสผ่าน มันอาจปรากฏในเอกสารที่อธิบายว่าทำไมมันไม่ปลอดภัย แต่ไม่ควรอยู่ในเส้นทางการสร้าง

คำแนะนำโดยละเอียด

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

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

สำหรับหัวข้อนี้ ค่าที่ตั้งไว้ในทางปฏิบัติคือ crypto.getRandomValues ร่วมกับการสุ่มตัวอย่างแบบปฏิเสธแทน Math.random คุณสามารถใช้ค่านี้กับ คู่มือ Web Crypto API จากนั้นเก็บค่าสุดท้ายในตัวจัดการรหัสผ่านที่เชื่อถือได้ PwdGen สร้างค่าในเครื่องในเบราว์เซอร์ด้วย Web Crypto รหัสผ่านที่สร้างขึ้นจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ PwdGen การออกแบบในเครื่องนั้นลดการเปิดเผยฝั่งเซิร์ฟเวอร์ แต่ไม่ได้ป้องกันทุกภัยคุกคาม ส่วนขยายเบราว์เซอร์ที่เป็นอันตราย อุปกรณ์ที่ถูกบุกรุก หน้า phishing หรือการจัดการคลิปบอร์ดที่ไม่ปลอดภัยยังคงสามารถเปิดเผยความลับหลังจากที่มันถูกสร้างขึ้น

ปัญหาที่พบบ่อยที่สุดที่ควรหลีกเลี่ยงคือลำดับสุ่มเทียมที่คาดเดาได้ อคติแบบโมดูโล (modulo bias) ฟังก์ชันสุ่มแบบกำหนดเอง และโค้ดตัวอย่างที่ถูกคัดลอกไปใช้ในการผลิต ปัญหาเหล่านี้มีความสำคัญเพราะผู้โจมตีแทบไม่ต้องเดารหัสผ่านทุกแบบที่เป็นไปได้เมื่อนิสัยของมนุษย์ทำให้พวกเขามีทางลัด Credential stuffing, phishing, รายการรหัสผ่านที่รั่วไหล และการละเมิดการกู้คืนบัญชีมักเป็นจริงมากกว่าการค้นหาทางคณิตศาสตร์ล้วนๆ นั่นคือเหตุผลที่คำแนะนำที่ดีที่สุดรวมคุณภาพรหัสผ่านเข้ากับการควบคุมระดับบัญชี เช่น MFA, passkeys, การจัดเก็บรหัสกู้คืน และการตรวจสอบอีเมลหรือเบอร์โทรศัพท์สำหรับกู้คืนเป็นประจำ

ใช้รายการตรวจสอบนี้เมื่อใช้คำแนะนำ:

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

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

ขั้นตอนต่อไปที่ปลอดภัย

หลังจากอ่านคู่มือนี้ ให้ทำการตรวจสอบบัญชีเล็กๆ หนึ่งบัญชีแทนที่จะพยายามแก้ไขทุกอย่างพร้อมกัน เลือกบัญชีที่จะสร้างปัญหามากที่สุดหากถูกยึดครอง ยืนยันว่ารหัสผ่านไม่ซ้ำ และตรวจสอบอีเมลกู้คืน เบอร์โทรศัพท์กู้คืน วิธี MFA และการจัดเก็บรหัสสำรอง หากส่วนใดของห่วงโซ่นั้นอ่อนแอ ให้ปรับปรุงส่วนนั้นก่อนที่จะย้ายไปยังบัญชีที่มีความเสี่ยงต่ำกว่า ลำดับนี้ทำให้งานจัดการได้และปกป้องบัญชีที่ผู้โจมตีมักใช้เป็นขั้นบันได สำหรับสาเหตุที่ math.random ไม่ปลอดภัยสำหรับรหัสผ่าน ผลลัพธ์ที่ดีที่สุดคือนิสัยที่ทำซ้ำได้: สร้างในเครื่อง เก็บอย่างระมัดระวัง และหลีกเลี่ยงการใช้ซ้ำ

คำถามที่พบบ่อย

Math.random ใช้ได้ในบางกรณีหรือไม่?

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

เครื่องมือสร้างรหัสผ่านควรใช้อะไรแทน?

ควรใช้แหล่งสุ่มทางเข้ารหัส เช่น crypto.getRandomValues() ในเบราว์เซอร์

PwdGen ใช้ Math.random เป็นทางเลือกสำรองหรือไม่?

ไม่ หาก Web Crypto ไม่พร้อมใช้งาน PwdGen จะแสดงคำเตือนความเข้ากันได้และไม่สร้างรหัสผ่านด้วย Math.random()

แหล่งที่มา