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

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

การสร้างรหัสผ่านฝั่งไคลเอ็นต์ด้วย Web Crypto และการสุ่มแบบปฏิเสธ

เอกสารทางเทคนิคอธิบายโมเดลการสร้างรหัสผ่านฝั่งเบราว์เซอร์ของ PwdGen ขอบเขตเอนโทรปี การสุ่มแบบปฏิเสธ และข้อจำกัดด้านความเป็นส่วนตัว

บทคัดย่อ

PwdGen ใช้วิธีการสร้างรหัสผ่านอ้างอิงฝั่งไคลเอ็นต์: Web Crypto ของเบราว์เซอร์หรือรันไทม์จะให้ไบต์สุ่ม การสุ่มแบบปฏิเสธจะแมปไบต์เหล่านั้นไปยังดัชนีที่มีขอบเขตไม่เอนเอียง และการสับเปลี่ยนแบบ Fisher-Yates จะกระจายคลาสอักขระที่ต้องการไปทั่วรหัสผ่านสุดท้าย วิธีการนี้มีขนาดเล็ก intentionally ตรวจสอบได้ และทำซ้ำได้ในเว็บแอป ตัวปรับ API CLI และแพ็คเกจ pwdgen-core ที่เตรียมไว้

เอกสารนี้อธิบายโมเดลทางวิศวกรรม ไม่ใช่การอ้างสิทธิ์ใน primitive การเข้ารหัสใหม่ มาตรฐานทางการ หรือการตรวจสอบโดยบุคคลที่สามอิสระ

แหล่งที่มาของการสุ่ม

ตัวสร้างจะขอค่าสุ่มที่แข็งแกร่งทางการเข้ารหัสผ่าน crypto.getRandomValues() การใช้งาน Web Crypto คาดว่าจะใช้ตัวสร้างตัวเลขสุ่มเทียมที่ปลอดภัยทางการเข้ารหัส (CSPRNG) ซึ่งถูก seed ด้วยเอนโทรปีคุณภาพสูงจากสภาพแวดล้อมโฮสต์ ในทางปฏิบัติ เบราว์เซอร์จะมอบหมายความรับผิดชอบนี้ให้กับระบบปฏิบัติการและผู้ให้บริการเข้ารหัสของแพลตฟอร์ม

PwdGen ไม่ได้อ้างว่าทุกการเรียกสร้างรหัสผ่านจะสุ่มตัวอย่างจากแหล่งสัญญาณรบกวนฮาร์ดแวร์โดยตรง ข้อความที่ปลอดภัยและแม่นยำกว่าคือ เบราว์เซอร์ให้เอาต์พุต CSPRNG ผ่าน Web Crypto API และ PwdGen หลีกเลี่ยงอินเทอร์เฟซสุ่มเทียมที่ไม่ใช่การเข้ารหัส

ทำไมไม่ใช้ Math.random()

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

PwdGen ถือว่าการสุ่มเทียมที่ไม่ปลอดภัยเป็นสถานะล้มเหลว หาก Web Crypto ไม่พร้อมใช้งาน ตัวสร้างควรแสดงข้อผิดพลาดด้านความเข้ากันได้ แทนที่จะสร้างข้อมูลประจำตัวที่อ่อนแออย่างเงียบๆ

การสุ่มแบบปฏิเสธ

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

PwdGen ใช้การสุ่มแบบปฏิเสธ:

  1. ดึงจำนวนเต็ม 32 บิตที่ไม่มีเครื่องหมาย
  2. คำนวณผลคูณที่มากที่สุดของขนาดชุดตัวอักษรที่พอดีในช่วง 32 บิต
  3. ปฏิเสธค่าที่อยู่เหนือขอบเขตนั้น
  4. ใช้ modulo เฉพาะกับช่วงที่สมบูรณ์ที่เหลือ

วิธีนี้ทำให้การเลือกอักขระที่มีขอบเขตสม่ำเสมอโดยไม่ทำให้เกิดอคติ modulo ที่วัดได้

ความครอบคลุมของอักขระและเอนโทรปี

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

ค่าประมาณเอนโทรปีทางทฤษฎีคือ:

bits = length × log2(uniqueAlphabetSize)

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

ขอบเขตความเป็นส่วนตัว

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

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

การนำไปใช้ที่ทำซ้ำได้

แพ็คเกจ pwdgen-cli สาธารณะและแพ็คเกจ pwdgen-core ที่เตรียมไว้มีไว้เพื่อให้โมเดลการสร้างสามารถตรวจสอบได้ภายนอกหน้าเว็บ การทดสอบหน่วยครอบคลุมการรวมคลาสอักขระ อักขระที่ยกเว้น การกำหนดค่าที่ไม่ถูกต้อง สูตรเอนโทรปี และการไม่มีเส้นทางโค้ดสุ่มเทียมที่ไม่ปลอดภัย

เป้าหมายไม่ใช่เพื่อทำให้ PwdGen เป็นมาตรฐานส่วนตัว เป้าหมายคือทำให้การนำไปใช้มีขนาดเล็กพอที่นักพัฒนาจะอ่าน ทดสอบ และแทนที่ได้เมื่อสภาพแวดล้อมของพวกเขาต้องการขอบเขตความเชื่อถือที่แตกต่างกัน

แหล่งที่มา