โดยทั่วไปคุณไม่จำเป็นต้องใช้อัลกอริทึมการแฮชมากกว่าหนึ่งรายการ
สิ่งที่คุณต้องทำคือ:
ใช้เกลือ: เกลือไม่ได้ใช้เพียงเพื่อทำให้รหัสผ่านของคุณปลอดภัยยิ่งขึ้นแต่ใช้เพื่อป้องกันการโจมตีแบบสายรุ้ง ด้วยวิธีนี้บางคนจะทำงานหนักขึ้นเพื่อพยายามคำนวณแฮชล่วงหน้าสำหรับรหัสผ่านที่คุณจัดเก็บไว้ในระบบของคุณ
ใช้การเชื่อมต่อที่หลากหลาย: แทนที่จะใช้เพียง SHA (รหัสผ่าน + เกลือ) ให้ทำ SHA (SHA (SHA (SHA (SHA (... SHA (... SHA (รหัสผ่าน + เกลือ)))))) หรือเพื่อเป็นตัวแทนในทางอื่น:
hash = sha(password + salt)
for i=1 , i=5000, i++ {
hash = sha(hash + salt);
}
และในที่สุดเลือกฟังก์ชั่นคร่ำเครียดที่ดี SHA, MD5 ฯลฯ จะไม่ดีเพราะพวกเขามีมากเกินไปได้อย่างรวดเร็ว เนื่องจากคุณต้องการใช้แฮชเพื่อการป้องกันคุณควรใช้แฮชที่ช้ากว่า ตัวอย่างเช่นลองดูที่Bcrypt , PBKDF2หรือScrypt
แก้ไข : หลังจากการสังเกตขอลองดูบางจุด (ขออภัยคำอธิบายที่ยาวถึงจุดสิ้นสุดเพราะอาจช่วยให้ผู้อื่นค้นหาคำตอบที่คล้ายกัน):
หากระบบของคุณปลอดภัยเหมือนไม่มีใครเคยเข้าถึงรหัสผ่านที่เก็บไว้คุณไม่จำเป็นต้องแฮช รหัสผ่านจะเป็นความลับไม่มีใครจะได้รับมัน
แต่ไม่มีใครรับประกันได้ว่าฐานข้อมูลด้วยรหัสผ่านจะถูกขโมย ขโมยฐานข้อมูลได้รับรหัสผ่านทั้งหมด ตกลงระบบของคุณและ บริษัท ของคุณจะประสบผลตามมาทั้งหมด ดังนั้นเราสามารถพยายามหลีกเลี่ยงการรั่วไหลของรหัสผ่านนี้
แจ้งให้ทราบ ว่าเราไม่กังวลเกี่ยวกับการโจมตีออนไลน์ในจุดนี้ สำหรับการโจมตีออนไลน์ครั้งเดียวทางออกที่ดีที่สุดคือการช้าลงหลังจากรหัสผ่านไม่ถูกต้องล็อคบัญชีหลังจากพยายามแล้ว ฯลฯ และไม่ว่าวิธีการเข้ารหัสแฮชจัดเก็บ ฯลฯ รหัสผ่านของคุณจะเป็นอย่างไร การโจมตีออนไลน์เป็นเรื่องของการชะลอตัวลงปัจจัยการผลิตรหัสผ่าน
ดังนั้นกลับไปที่don't let them take my plain passwords
ปัญหา คำตอบนั้นง่าย: อย่าเก็บไว้เป็นข้อความธรรมดา ตกลงเข้าใจแล้ว
จะหลีกเลี่ยงได้อย่างไร
เข้ารหัสรหัสผ่าน (?) แต่อย่างที่คุณรู้ถ้าคุณเข้ารหัสคุณสามารถถอดรหัสกลับหากคุณมีรหัสที่ถูกต้อง และคุณจะพบกับปัญหาของ "สถานที่ซ่อน" กุญแจ ไม่ดีเพราะพวกเขามีฐานข้อมูลคุณพวกเขาสามารถรับกุญแจของคุณได้ ตกลงอย่าใช้มัน
อีกวิธีหนึ่ง: เปลี่ยนรหัสผ่านเป็นอย่างอื่นที่ไม่สามารถย้อนกลับและเก็บไว้ได้ และเพื่อตรวจสอบว่ารหัสผ่านที่ให้มานั้นถูกต้องหรือไม่เราทำกระบวนการเดียวกันอีกครั้งและตรวจสอบว่าค่าที่เปลี่ยนสองค่าตรงกันหรือไม่ หากพวกเขาตรงกัน = รหัสผ่านที่ดีถูกให้
โอเคดีมาก ลองใช้ MD5 แฮชในรหัสผ่านกัน แต่ ... ถ้ามีใครบางคนมีค่าแฮชของรหัสผ่านที่เก็บไว้เขาสามารถมีพลังงานคอมพิวเตอร์จำนวนมากในการคำนวณแฮช MD5 ของรหัสผ่านที่เป็นไปได้ทั้งหมด (กำลังดุร้าย) ดังนั้นเขาจึงสามารถค้นหารหัสผ่านเดิมได้ หรือแม้แต่เลวร้ายที่สุดเขาสามารถเก็บ MD5 ทั้งหมดจากชุดอักขระทั้งหมดและค้นหารหัสผ่านได้อย่างง่ายดาย ดังนั้นทำซ้ำมากการแฮช (HASH (HASH ())) สิ่งที่ทำให้มันยากขึ้นเพราะมันจะใช้เวลามากขึ้น
แต่ถึงกระนั้นก็สามารถที่จะวนเวียนอยู่รอบ ๆ โต๊ะสายรุ้งถูกสร้างขึ้นอย่างแม่นยำเพื่อเร่งการป้องกันชนิดนี้
งั้นลองใช้เกลือกันดู ด้วยวิธีนี้ในการโต้ตอบแต่ละครั้งเกลือจะถูกใช้อีกครั้ง หนึ่งในความพยายามที่จะโจมตีรหัสผ่านของคุณจะต้องสร้างตารางรุ้งโดยพิจารณาว่ามีการเพิ่มเกลือในแต่ละครั้ง และเมื่อเขาสร้างตารางรุ้งนั้นเนื่องจากมันถูกสร้างขึ้นด้วยเกลือหนึ่งเกลือเขาจะต้องคำนวณอีกครั้งด้วยเกลืออื่นดังนั้นเขาจะต้องใช้เวลาในแต่ละรหัสผ่าน (= แต่ละเกลือ) ซอลท์จะไม่เพิ่ม "ความซับซ้อนมากขึ้น" ให้กับรหัสผ่านมันจะทำให้ผู้โจมตีสร้างตารางรุ้งหากคุณใช้หนึ่งเกลือสำหรับแต่ละรหัสผ่านตารางจากเกลือหนึ่งจะไร้ประโยชน์กับรหัสผ่านอื่น
และการใช้แฮชมากกว่าหนึ่งจะช่วยได้ที่นี่ ไม่ได้บุคคลที่สร้างการโจมตีสายรุ้งที่เฉพาะเจาะจงจะสามารถสร้างมันได้โดยใช้หนึ่งหรือมากกว่าหนึ่งแฮช
และการใช้แฮชมากกว่าหนึ่งสามารถทำให้คุณมีปัญหาหนึ่ง: มันปลอดภัยเท่ากับแฮชที่อ่อนแอที่สุดที่คุณใช้ หากมีคนพบการชนกันในอัลกอริธึมการแฮชหนึ่งครั้งแฮชนั้นจะถูกนำไปใช้ในกระบวนการวนซ้ำ ณ จุดใดก็ได้เพื่อทำลายรหัสผ่าน ดังนั้นคุณจะไม่ได้รับอะไรเลยโดยใช้อัลกอริธึมแฮชเพิ่มเติมควรเลือก algo ที่ดีเพียงอันเดียว และใช้มัน และถ้า yuo เคยได้ยินว่ามันพังให้คิดว่าคุณจะเปลี่ยนมันอย่างไรในใบสมัครของคุณ
และทำไมต้องใช้ bcrypt หรืออะไรทำนองนั้น (คุณบอกว่าคุณใช้มัน): เพราะผู้โจมตีจะต้องใช้เวลามากขึ้นในการสร้างตาราง นั่นเป็นสาเหตุที่การใช้ MD5 + การรอ (3 วินาที) ไม่ช่วย: การโจมตีจะออฟไลน์อยู่แล้วดังนั้นผู้โจมตีสามารถสร้างตารางได้โดยไม่ต้องล่าช้า (3 วินาที)