ใช้อัลกอริทึมการแฮชรหัสผ่านทุกครั้ง: Argon2 , scrypt , bcryptหรือ PBKDF2
Argon2ชนะการแข่งขัน hashing รหัสผ่าน 2015 Scrypt , bcryptและ PBKDF2เป็นอัลกอริทึมที่เก่ากว่าซึ่งถือว่าเป็นที่ต้องการน้อยลงในขณะนี้ แต่ก็ยังฟังดูดีกว่าดังนั้นหากแพลตฟอร์มของคุณไม่รองรับ Argon2 คุณก็สามารถใช้อัลกอริทึมอื่นได้แล้ว
อย่าเก็บรหัสผ่านโดยตรงในฐานข้อมูล อย่าเข้ารหัส: มิฉะนั้นหากเว็บไซต์ของคุณถูกละเมิดผู้โจมตีจะได้รับรหัสถอดรหัสและสามารถรับรหัสผ่านทั้งหมดได้ รหัสผ่านจะต้องถูกแฮชถกกัน
กัญชารหัสผ่านมีคุณสมบัติที่แตกต่างจากกัญชาตารางแฮชหรือกัญชาเข้ารหัสลับ อย่าใช้แฮชการเข้ารหัสลับทั่วไปเช่น MD5, SHA-256 หรือ SHA-512 ในรหัสผ่าน อัลกอริทึมการแฮชรหัสผ่านใช้เกลือซึ่งเป็นลักษณะเฉพาะ (ไม่ได้ใช้สำหรับผู้ใช้รายอื่นหรือในฐานข้อมูลของผู้อื่น) จำเป็นต้องมีเกลือเพื่อให้ผู้โจมตีไม่สามารถคำนวณแฮชของรหัสผ่านทั่วไปล่วงหน้าได้ด้วยเกลือพวกเขาต้องเริ่มการคำนวณใหม่สำหรับทุกบัญชี อัลกอริทึมการแฮชรหัสผ่านนั้นช้ามาก - ช้าที่สุดเท่าที่จะทำได้ ความเชื่องช้าทำให้ผู้โจมตีทำร้ายมากกว่าคุณเพราะผู้โจมตีต้องลองใช้รหัสผ่านที่แตกต่างกันมากมาย สำหรับข้อมูลเพิ่มเติมโปรดดูที่วิธีการรหัสผ่านกัญชาปลอดภัย
แฮชรหัสผ่านเข้ารหัสข้อมูลสี่ส่วน:
- ตัวบ่งชี้ของอัลกอริทึมที่ใช้ นี่เป็นสิ่งจำเป็นสำหรับความคล่องตัว : คำแนะนำการเข้ารหัสเปลี่ยนไปตามกาลเวลา คุณต้องสามารถเปลี่ยนเป็นอัลกอริทึมใหม่
- ตัวบ่งชี้ความยากลำบากหรือความแข็ง ยิ่งค่านี้สูงขึ้นเท่าใดการคำนวณก็ยิ่งจำเป็นต้องมีการคำนวณแฮช นี่ควรเป็นค่าคงที่หรือการกำหนดค่าส่วนกลางในฟังก์ชั่นการเปลี่ยนรหัสผ่าน แต่ควรเพิ่มขึ้นเมื่อเวลาผ่านไปเมื่อคอมพิวเตอร์เร็วขึ้นดังนั้นคุณต้องจำค่าสำหรับแต่ละบัญชี อัลกอริทึมบางตัวมีค่าตัวเลขเดียวส่วนอื่น ๆ มีพารามิเตอร์เพิ่มเติมที่นั่น (ตัวอย่างเช่นเพื่อปรับการใช้งาน CPU และการใช้ RAM แยกต่างหาก)
- เกลือ. เนื่องจากเกลือจะต้องไม่ซ้ำกันทั่วโลกจึงต้องเก็บไว้สำหรับแต่ละบัญชี ควรสร้างเกลือแบบสุ่มในการเปลี่ยนรหัสผ่านแต่ละครั้ง
- แฮชที่เหมาะสมคือผลลัพธ์ของการคำนวณทางคณิตศาสตร์ในอัลกอริทึมการแปลงแป้นพิมพ์
ห้องสมุดหลายแห่งมีฟังก์ชั่นการจับคู่ที่สะดวกในการบรรจุข้อมูลนี้เป็นสายเดี่ยว: อันที่ใช้ตัวบ่งชี้อัลกอริทึม, ตัวบ่งชี้ความแข็งและรหัสผ่าน, สร้างเกลือแบบสุ่มและส่งคืนแฮชสตริงเต็ม และอีกอันที่ใช้รหัสผ่านและสตริงแฮชแบบเต็มเป็นอินพุตและส่งคืนบูลีนที่ระบุว่ารหัสผ่านนั้นถูกต้อง ไม่มีมาตรฐานสากล แต่การเข้ารหัสทั่วไปคือ
$ อัลกอริทึม $ พารามิเตอร์ $ เกลือ $เอาท์พุท
โดยที่algorithm
เป็นตัวเลขหรือสตริงตัวอักษรผสมตัวเลขสั้น ๆ ที่เลือกใช้อัลกอริทึมparameters
เป็นสตริงที่พิมพ์ได้และsalt
และoutput
ถูกเข้ารหัสใน Base64 โดยไม่ยกเลิก=
โดยไม่ต้องยกเลิก
16 ไบต์เพียงพอสำหรับเกลือและเอาท์พุท (ดูเช่นคำแนะนำสำหรับ Argon2 ) เข้ารหัสใน Base64 นั่นคือ 21 ตัวอักษรแต่ละตัว อีกสองส่วนขึ้นอยู่กับอัลกอริทึมและพารามิเตอร์ แต่ตัวอักษร 20–40 เป็นเรื่องปกติ นั่นคือทั้งหมดประมาณ 82 อักขระ ASCII ( CHAR(82)
และไม่จำเป็นต้องใช้ Unicode) ซึ่งคุณควรเพิ่มระยะขอบความปลอดภัยถ้าคุณคิดว่ามันยากที่จะขยายสนามในภายหลัง
หากคุณเข้ารหัสแฮชในรูปแบบไบนารี่คุณสามารถลดขนาดได้ถึง 1 ไบต์สำหรับอัลกอริธึม, 1–4 ไบต์สำหรับความแข็ง (ถ้าคุณเขียนโค้ดพารามิเตอร์บางตัว) และ 16 ไบต์สำหรับเกลือและเอาท์พุท รวมเป็น 37 ไบต์ พูด40 ไบต์ (BINARY(40)
) ให้มีอย่างน้อยสองสามไบต์ โปรดทราบว่าสิ่งเหล่านี้เป็นไบต์ 8 บิตไม่ใช่อักขระที่พิมพ์ได้โดยเฉพาะอย่างยิ่งฟิลด์สามารถรวมไบต์ว่าง
โปรดทราบว่าความยาวของแฮชไม่เกี่ยวข้องกับความยาวของรหัสผ่านโดยสมบูรณ์