สิ่งหนึ่งที่ฉันไม่เห็นที่กล่าวถึงในที่นี้แม้ว่าจะเป็นส่วนเสริมของคำตอบของ Marcus Adams ก็คือคุณไม่ควรใช้ข้อมูลเพียงชิ้นเดียวในการระบุและรับรองความถูกต้องของผู้ใช้หากมีความเป็นไปได้ในการโจมตีตามเวลาซึ่งสามารถ ใช้ความแตกต่างของเวลาตอบสนองเพื่อคาดเดาว่าการเปรียบเทียบสตริงไปได้ไกลแค่ไหน
หากคุณใช้ระบบที่ใช้ "คีย์" เพื่อค้นหาผู้ใช้หรือข้อมูลรับรองข้อมูลส่วนนั้นอาจถูกคาดเดาเพิ่มขึ้นเมื่อเวลาผ่านไปโดยการส่งคำขอหลายพันรายการและตรวจสอบเวลาที่ฐานข้อมูลของคุณใช้ในการค้นหา (หรือไม่ ค้นหา) บันทึก โดยเฉพาะอย่างยิ่งหาก "คีย์" ถูกเก็บไว้ในข้อความธรรมดาแทนที่จะเป็นแฮชทางเดียวของคีย์ คุณต้องการจัดเก็บคีย์ของผู้ใช้ในรูปแบบข้อความธรรมดาหรือเข้ารหัสแบบสมมาตรหากคุณต้องการให้สามารถแสดงคีย์ให้กับผู้ใช้ได้อีกครั้ง
เมื่อมีข้อมูลชิ้นที่สองหรือ "ความลับ" ก่อนอื่นคุณสามารถค้นหาผู้ใช้หรือข้อมูลรับรองโดยใช้ "คีย์" ซึ่งอาจเสี่ยงต่อการโจมตีตามเวลาจากนั้นใช้ฟังก์ชันเปรียบเทียบเวลาที่ปลอดภัยเพื่อตรวจสอบค่าของ ความลับ".
นี่คือการใช้งานฟังก์ชันนั้นของ Python:
https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727
และมีการเปิดเผยใน hmac
lib (และอาจเป็นอื่น ๆ ):
https://docs.python.org/3/library/hmac.html#hmac.compare_digest
สิ่งหนึ่งที่ควรทราบก็คือฉันไม่คิดว่าการโจมตีแบบนี้จะใช้ได้กับค่าที่แฮชหรือเข้ารหัสก่อนการค้นหาเนื่องจากค่าที่เปรียบเทียบจะเปลี่ยนแปลงแบบสุ่มทุกครั้งที่อักขระในสตริงอินพุตเปลี่ยนแปลง ฉันพบคำอธิบายที่ดีเกี่ยวกับเรื่องนี้ที่นี่
โซลูชันสำหรับการจัดเก็บคีย์ API จะเป็น:
- ใช้คีย์และความลับแยกกันใช้คีย์เพื่อค้นหาเรกคอร์ดและใช้การเปรียบเทียบเวลาที่ปลอดภัยเพื่อตรวจสอบความลับ สิ่งนี้ช่วยให้คุณสามารถแสดงรหัสและความลับแก่ผู้ใช้อีกครั้ง
- ใช้คีย์และความลับแยกกันใช้การเข้ารหัสแบบสมมาตรกำหนดความลับและทำการเปรียบเทียบความลับที่เข้ารหัสตามปกติ วิธีนี้ช่วยให้คุณสามารถแสดงรหัสและความลับแก่ผู้ใช้อีกครั้งและช่วยให้คุณไม่ต้องใช้การเปรียบเทียบตามเวลา
- ใช้คีย์และความลับแยกกันแสดงความลับแฮชและเก็บไว้จากนั้นทำการเปรียบเทียบความลับที่แฮชตามปกติ วิธีนี้จะขจัดความจำเป็นในการใช้การเข้ารหัสสองทางและมีประโยชน์เพิ่มเติมในการรักษาความลับของคุณให้ปลอดภัยหากระบบถูกบุกรุก มีข้อเสียที่คุณไม่สามารถแสดงความลับให้ผู้ใช้เห็นได้อีก
- ใช้คีย์เดียวแสดงให้ผู้ใช้ดูหนึ่งครั้งแฮชแล้วทำการค้นหาคีย์ที่แฮชหรือเข้ารหัสตามปกติ ซึ่งใช้คีย์เดียว แต่ไม่สามารถแสดงให้ผู้ใช้ได้เห็นอีก มีประโยชน์ในการรักษาความปลอดภัยของคีย์หากระบบถูกบุกรุก
- ใช้คีย์เดียวแสดงให้ผู้ใช้เห็นครั้งเดียวเข้ารหัสและทำการค้นหาข้อมูลลับที่เข้ารหัสตามปกติ สามารถแสดงให้ผู้ใช้ได้เห็นอีกครั้ง แต่ต้องเสียค่าใช้จ่ายในการมีคีย์ที่เสี่ยงหากระบบถูกบุกรุก
ในจำนวนนี้ฉันคิดว่า 3 คือความสมดุลของความปลอดภัยและความสะดวกสบายที่ดีที่สุด ฉันเห็นสิ่งนี้ถูกนำไปใช้ในหลาย ๆ เว็บไซต์เมื่อได้รับคีย์
นอกจากนี้ฉันเชิญผู้เชี่ยวชาญด้านความปลอดภัยที่แท้จริงให้วิจารณ์คำตอบนี้ ฉันแค่อยากจะเอาสิ่งนี้ออกไปเป็นประเด็นสนทนาอื่น