ฉันจะให้เวลาที่แตกต่างออกไปเล็กน้อยในเรื่องนี้
ฉันมักจะเก็บเกลือผสมกับแฮชรหัสผ่านเกลือ
ตัวอย่างเช่นฉันจะวางครึ่งแรกของเกลือก่อนที่แฮชเค็มของรหัสผ่านและครึ่งสุดท้ายของเกลือหลังจากแฮชเค็มของรหัสผ่าน แอปพลิเคชันตระหนักถึงการออกแบบนี้จึงสามารถดึงข้อมูลนี้และรับแฮชเค็มและเกลือ - รหัสผ่าน
เหตุผลของฉันสำหรับวิธีนี้:
หากข้อมูลรหัสผ่าน / แฮชถูกบุกรุกและอยู่ในมือของผู้โจมตีผู้โจมตีจะไม่ทราบว่าเกลือนั้นมาจากการดูข้อมูล วิธีนี้ผู้โจมตีจะไม่สามารถทำการโจมตีแบบเดรัจฉานเพื่อรับรหัสผ่านที่ตรงกับแฮชได้เนื่องจากเขาไม่รู้แฮชที่จะเริ่มต้นและไม่มีทางที่จะรู้ว่าส่วนใดของข้อมูลที่เป็นส่วนหนึ่งของเกลือหรือ ส่วนของแฮชรหัสผ่านเค็ม ( เว้นแต่เขาจะรู้ตรรกะการตรวจสอบใบสมัครของคุณ )
หากแฮชรหัสผ่านเค็มถูกจัดเก็บตามที่เป็นดังนั้นการโจมตีด้วยกำลังดุร้ายสามารถดำเนินการเพื่อรับรหัสผ่านที่เมื่อเค็มและแฮชสร้างข้อมูลเดียวกันกับแฮชรหัสผ่านเค็ม
อย่างไรก็ตามตัวอย่างเช่นแม้ว่าแฮชรหัสผ่านจะถูกเก็บไว้ตามที่เป็นอยู่ แต่ pre-pended ด้วยการสุ่มไบต์เดียวตราบใดที่ผู้โจมตีไม่ทราบว่าไบต์แรกนี้จะถูกยกเลิกสิ่งนี้จะเพิ่มความยากลำบาก ของการโจมตี แอปพลิเคชันของคุณจะรู้ว่าจะละไบต์แรกของข้อมูลเมื่อใช้ในการตรวจสอบผู้ใช้ของคุณ
บทสรุปของเรื่องนี้ ..
1) อย่าเก็บข้อมูลที่แอปพลิเคชันตรวจสอบความถูกต้องของคุณใช้ในรูปแบบที่แน่นอน
2) ถ้าเป็นไปได้ให้เก็บลอจิกความลับของคุณเพื่อความปลอดภัย
ไปอีกขั้นหนึ่ง ..
หากคุณไม่สามารถเก็บความลับตรรกะการตรวจสอบแอปพลิเคชันของคุณได้ผู้คนจำนวนมากรู้ว่าข้อมูลของคุณถูกเก็บไว้ในฐานข้อมูลอย่างไร และสมมติว่าคุณตัดสินใจที่จะเก็บแฮชรหัสผ่านเค็มผสมกับเกลือพร้อมกับเกลือบางส่วนที่เตรียมแฮชรหัสผ่านเค็มและส่วนที่เหลือของเกลือจะผนวกเข้าด้วยกัน
เมื่อสร้างเกลือสุ่มคุณสามารถสุ่มเลือกสัดส่วนเกลือที่คุณจะเก็บไว้ก่อน / หลังแฮชรหัสผ่านเกลือ
ตัวอย่างเช่นคุณสร้างเกลือสุ่ม 512 ไบต์ คุณเพิ่มเกลือต่อท้ายรหัสผ่านของคุณและรับแฮช SHA-512 ของรหัสผ่านเค็มของคุณ คุณยังสร้างจำนวนเต็มแบบสุ่ม 200 จากนั้นคุณเก็บเกลือ 200 ไบต์แรกตามด้วยแฮชรหัสผ่านเค็มตามด้วยส่วนที่เหลือของเกลือ
เมื่อตรวจสอบการป้อนรหัสผ่านของผู้ใช้แอปพลิเคชันของคุณจะผ่านสตริงและถือว่า 1 ไบต์แรกของข้อมูลคือ 1 ไบต์แรกของเกลือตามด้วยเกลือเค็ม บัตรผ่านนี้จะล้มเหลว แอปพลิเคชันจะดำเนินการต่อโดยใช้ 2 ไบต์แรกของข้อมูลเป็น 2 ไบต์แรกของเกลือและทำซ้ำจนกว่าจะพบผลลัพธ์ที่เป็นบวกหลังจากใช้ 200 ไบต์แรกเป็น 200 ไบต์แรกของเกลือ หากรหัสผ่านไม่ถูกต้องแอปพลิเคชันจะยังคงพยายามเปลี่ยนลำดับทั้งหมดจนกว่าจะไม่พบ
ข้อดีของวิธีนี้:
เพิ่มความปลอดภัย - แม้ว่าจะรู้จักตรรกะการพิสูจน์ตัวตนของคุณแล้วก็ตามตรรกะที่แน่นอนนั้นไม่เป็นที่รู้จักในเวลารวบรวม เป็นไปไม่ได้ที่จะทำการโจมตีด้วยกำลังดุร้ายถึงแม้จะมีความรู้ในเรื่องของตรรกะก็ตาม ความยาวของเกลือที่เพิ่มขึ้นจะเพิ่มความปลอดภัยมากขึ้น
ข้อเสียของวิธีการนี้:
เนื่องจากลอจิกที่แน่นอนได้รับการอนุมาน ณ รันไทม์, วิธีการนี้จึงใช้ CPU มาก ยิ่งความยาวของเกลือเพิ่มมากขึ้นเท่าไหร่การใช้ CPU มากขึ้นก็จะยิ่งมากขึ้นเท่านั้น
การตรวจสอบรหัสผ่านที่ไม่ถูกต้องจะเกี่ยวข้องกับต้นทุน CPU สูงสุด สิ่งนี้สามารถตอบโต้คำขอที่ถูกกฎหมาย แต่เพิ่มความปลอดภัยจากผู้โจมตี
วิธีการนี้สามารถนำไปใช้ในรูปแบบต่าง ๆ และสามารถทำให้ปลอดภัยยิ่งขึ้นโดยใช้เกลือความกว้างตัวแปรและ / หรือแฮชรหัสผ่านเค็ม