ความคิดที่ดีที่สุดคือไม่ต้องพลิกโฉมพวงมาลัย แต่ฉันเข้าใจว่าในโลก PHP มันอาจเป็นเรื่องยากที่จะหาส่วนประกอบที่มีคุณภาพสูงซึ่งทำเช่นนั้นแล้ว (แม้ว่าฉันค่อนข้างแน่ใจว่ากรอบการใช้สิ่งเหล่านี้และการใช้งานของพวกเขาได้รับการทดสอบแล้ว )
ใช้ PBKDF2 หรือ bcrypt ถ้าคุณสามารถ มันทำเพื่อสิ่งนั้น
เหตุผล: อัลกอริทึมทั้งสองสามารถทำให้กระบวนการแฮชช้าโดยพลการซึ่งเป็นสิ่งที่คุณต้องการเมื่อ hashing รหัสผ่าน (ทางเลือกที่เร็วกว่าหมายถึงแรงเดรัจฉานง่ายขึ้น) เป็นการดีที่คุณควรปรับพารามิเตอร์เพื่อให้กระบวนการช้าลงและช้าลงตามเวลาบนฮาร์ดแวร์เดียวกันในขณะที่ปล่อยฮาร์ดแวร์ใหม่เร็วขึ้น
ถ้าคุณทำไม่ได้อย่างน้อยอย่าใช้ MD5 / SHA1 ไม่เคย ลืมมันไปเถอะ ตัวอย่างเช่นใช้ SHA512 แทน ใช้เกลือด้วย
เหตุผล: MD5 และ SHA1 เร็วเกินไป หากผู้โจมตีสามารถเข้าถึงฐานข้อมูลของคุณที่มีแฮชและมีเครื่องที่ทรงพลัง (ไม่ได้โดยเฉพาะ) การบังคับใช้รหัสผ่านอย่างดุเดือดทำได้ง่ายและรวดเร็ว หากไม่มีเกลือโอกาสที่ผู้โจมตีจะพบรหัสผ่านที่แท้จริงนั้นจะเพิ่มขึ้น (ซึ่งอาจเป็นอันตรายเพิ่มเติมหากรหัสผ่านนั้นถูกนำกลับมาใช้ที่อื่น)
ใน PHP 5.5.0 และภายหลังการใช้งานและpassword_hash
password_verify
เหตุผล: การเรียกฟังก์ชั่นที่ได้รับจากเฟรมเวิร์กนั้นง่ายดังนั้นความเสี่ยงในการทำผิดพลาดจึงลดลง ด้วยฟังก์ชั่นทั้งสองนี้คุณไม่ต้องคิดเกี่ยวกับพารามิเตอร์ต่าง ๆ เช่นแฮช ฟังก์ชั่นแรกส่งกลับสตริงเดียวซึ่งสามารถเก็บไว้ในฐานข้อมูล ฟังก์ชั่นที่สองใช้สายนี้สำหรับการตรวจสอบรหัสผ่าน
ป้องกันตัวเองจากแรงเดรัจฉาน หากผู้ใช้ส่งรหัสผ่านผิดเมื่อเธอส่งรหัสผ่านผิดอีก 0.01 วินาทีที่ผ่านมาเป็นเหตุผลที่ดีในการปิดกั้น ในขณะที่มนุษย์สามารถพิมพ์ได้อย่างรวดเร็วพวกเขาอาจจะไม่สามารถที่รวดเร็ว
การป้องกันอื่นจะเป็นการตั้งค่าขีดจำกัดความล้มเหลวต่อชั่วโมง หากผู้ใช้ส่งรหัสผ่านไม่ถูกต้อง 3600 ชั่วโมงใน 1 ชั่วโมงรหัสผ่าน 1 ต่อวินาทีก็ยากที่จะเชื่อว่านี่เป็นผู้ใช้ที่ถูกกฎหมาย
เหตุผล: หากรหัสผ่านของคุณถูกแฮชในแบบที่ไม่ปลอดภัยการบังคับเดรัจฉานอาจมีประสิทธิภาพมาก หากรหัสผ่านถูกเก็บอย่างปลอดภัยการใช้งานเดรัจฉานยังคงเป็นการสิ้นเปลืองทรัพยากรของเซิร์ฟเวอร์และแบนด์วิดท์เครือข่ายของคุณ การตรวจจับแรงแบบดุร้ายนั้นไม่ใช่เรื่องง่ายที่จะพัฒนาและทำให้ถูกต้อง แต่สำหรับระบบเล็ก ๆ แต่มันก็คุ้มค่า
อย่าขอให้ผู้ใช้เปลี่ยนรหัสผ่านทุกสี่สัปดาห์ นี่เป็นเรื่องที่น่ารำคาญอย่างมากและลดความปลอดภัยลงเนื่องจากมันสนับสนุนการรักษาความปลอดภัยหลังการใช้
เหตุผล: ความคิดที่ว่าบังคับรหัสผ่านที่จะเปลี่ยนทุกnสัปดาห์ปกป้องระบบจากแรงเดรัจฉานที่ไม่ถูกต้อง การโจมตีด้วยกำลังดุร้ายมักจะประสบความสำเร็จภายในไม่กี่วินาทีนาทีชั่วโมงหรือวันซึ่งทำให้การเปลี่ยนรหัสผ่านรายเดือนไม่เกี่ยวข้อง ในทางกลับกันผู้ใช้จำรหัสผ่านไม่ถูกต้อง หากพวกเขาจำเป็นต้องเปลี่ยนรหัสผ่านพวกเขาจะพยายามใช้รหัสผ่านที่ง่ายมากหรือเพียงแค่จดบันทึกรหัสผ่านไว้ที่โพสต์
ตรวจสอบทุกอย่างทุกครั้ง จัดเก็บการเข้าสู่ระบบ แต่อย่าเก็บรหัสผ่านไว้ในบันทึกการตรวจสอบ ตรวจสอบให้แน่ใจว่าไม่สามารถแก้ไขบันทึกการตรวจสอบได้ (เช่นคุณสามารถเพิ่มข้อมูลได้ในตอนท้าย แต่ไม่สามารถแก้ไขข้อมูลที่มีอยู่ได้) ตรวจสอบให้แน่ใจว่าบันทึกการตรวจสอบอยู่ภายใต้การสำรองข้อมูลปกติ ตามหลักแล้วบันทึกควรถูกเก็บไว้ในเซิร์ฟเวอร์เฉพาะที่มีการเข้าถึงที่ จำกัด มาก: หากเซิร์ฟเวอร์อื่นถูกแฮกผู้โจมตีจะไม่สามารถล้างบันทึกเพื่อซ่อนการแสดงตนของเขา (และเส้นทางที่ใช้ในระหว่างการโจมตี)
อย่าจดจำข้อมูลรับรองผู้ใช้ในคุกกี้เว้นแต่ผู้ใช้ขอให้ทำ (ช่องทำเครื่องหมาย "จดจำฉัน" จะต้องไม่ถูกตรวจสอบโดยค่าเริ่มต้นเพื่อหลีกเลี่ยงข้อผิดพลาดของมนุษย์)