ประการแรกคำศัพท์บางคำที่มีความสำคัญ:
การแฮช - การกระทำของการรับสตริงและสร้างลำดับของอักขระที่ไม่สามารถเปลี่ยนกลับเป็นสตริงเดิมได้
Symmetric Encryption - (โดยปกติจะเรียกว่า 'การเข้ารหัส') - การกระทำของการรับสตริงและสร้างลำดับของอักขระที่สามารถ ถอดรหัสไปยังสตริงดั้งเดิมโดยใช้คีย์การเข้ารหัสเดียวกันกับที่เข้ารหัส
Rainbow Table -ตารางการค้นหาที่มีอักขระรูปแบบต่างๆที่แฮชในอัลกอริทึมการแฮชเฉพาะ
Salt - สตริงสุ่มที่รู้จักต่อท้ายสตริงดั้งเดิมก่อนที่จะแฮช
สำหรับ. NET Framework Bcrypt ยังไม่มีการนำไปใช้อ้างอิงที่ตรวจสอบแล้ว นี่เป็นสิ่งสำคัญเนื่องจากไม่มีทางทราบได้ว่ามีข้อบกพร่องร้ายแรงในการใช้งานที่มีอยู่หรือไม่ คุณจะได้รับการดำเนินการของbcrypt สำหรับ NET ที่นี่ ฉันไม่รู้เกี่ยวกับการเข้ารหัสมากพอที่จะบอกได้ว่าเป็นการใช้งานที่ดีหรือไม่ดี การเข้ารหัสเป็นฟิลด์ที่ลึกมาก อย่าพยายามที่จะสร้างวิธีการเข้ารหัสของคุณเอง อย่างจริงจัง.
หากคุณกำลังจะใช้การรักษาความปลอดภัยรหัสผ่านของคุณเอง (ถอนหายใจ) คุณต้องทำหลายอย่าง:
- ใช้วิธีกัญชาค่อนข้างเชื่อถือได้
- ใส่รหัสผ่านแต่ละรหัสก่อนแฮช
- ใช้เกลือที่ไม่ซ้ำกันและยาวสำหรับแต่ละรหัสผ่านและเก็บเกลือด้วยรหัสผ่าน
- ต้องการรหัสผ่านที่คาดเดายาก
น่าเสียดายที่แม้ว่าคุณจะทำทั้งหมดนี้ แต่แฮ็กเกอร์ที่มุ่งมั่นก็ยังสามารถหารหัสผ่านได้ แต่ก็ต้องใช้เวลานานมาก นั่นเป็นหัวหน้าศัตรูของคุณ: เวลา
อัลกอริทึม bcrypt ทำงานเพราะมันใช้เวลาห้าคำสั่งของขนาดอีกต่อไปเพื่อกัญชารหัสผ่านกว่า MD5 ; (และยังนานกว่า AES หรือ SHA-512) มันบังคับให้แฮ็กเกอร์ใช้เวลามากขึ้นในการสร้างตารางสายรุ้งเพื่อค้นหารหัสผ่านของคุณทำให้มีโอกาสน้อยที่รหัสผ่านของคุณจะตกอยู่ในอันตรายจากการถูกแฮ็ก
หากคุณกำลังใส่เกลือและแฮชรหัสผ่านและเกลือแต่ละชนิดแตกต่างกันแฮ็กเกอร์ที่มีศักยภาพจะต้องสร้างตารางสายรุ้งสำหรับเกลือแต่ละรูปแบบเพื่อให้มีตารางสายรุ้งสำหรับรหัสผ่านที่แฮช + เค็มหนึ่งอัน นั่นหมายความว่าหากคุณมีผู้ใช้ 1 ล้านคนแฮ็กเกอร์จะต้องสร้างตารางสายรุ้ง 1 ล้านตาราง หากคุณใช้เกลือเดียวกันสำหรับผู้ใช้ทุกคนแฮ็กเกอร์จะต้องสร้างตารางสายรุ้ง 1 โต๊ะเพื่อแฮ็คระบบของคุณได้สำเร็จ
หากคุณไม่ได้ใส่รหัสผ่านของคุณผู้โจมตีทั้งหมดต้องทำคือดึงตาราง Rainbow ที่มีอยู่สำหรับการใช้งานทุกครั้งที่นั่น (AES, SHA-512, MD5) และดูว่ามีอันใดตรงกับแฮชหรือไม่ นี้ได้ทำไปแล้วผู้โจมตีไม่จำเป็นต้องคำนวณเหล่านี้ตารางเรนโบว์ตัวเอง
ถึงแม้จะมีทั้งหมดนี้คุณได้มีการใช้การรักษาความปลอดภัยที่ดี หากพวกเขาสามารถใช้เวกเตอร์โจมตีอื่น (XSS, SQL Injection, CSRF และอื่น ๆ ) บนไซต์ของคุณได้สำเร็จการรักษาความปลอดภัยด้วยรหัสผ่านที่ดีก็ไม่สำคัญ ดูเหมือนจะเป็นคำสั่งที่ขัดแย้งกัน แต่ลองคิดดูสิ: ถ้าฉันสามารถรับข้อมูลผู้ใช้ทั้งหมดของคุณผ่านการโจมตีด้วยการฉีด SQL หรือฉันสามารถให้ผู้ใช้ของคุณให้คุกกี้ผ่าน XSS กับฉันได้ก็ไม่สำคัญว่ารหัสผ่านของคุณจะดีแค่ไหน ความปลอดภัยคือ .
แหล่งข้อมูลอื่น ๆ :
- Jeff Atwood: การเข้ารหัส. NET แบบง่าย (เหมาะสำหรับภาพรวมของการแฮช)
- Jeff Atwood: ฉันเพิ่งเข้าสู่ระบบในฐานะคุณ
- Jeff Atwood: คุณอาจจัดเก็บรหัสผ่านไม่ถูกต้อง
- Jeff Atwood: Speed Hashing
หมายเหตุ:โปรดแนะนำแหล่งข้อมูลดีๆอื่น ๆ ฉันต้องอ่านบทความเป็นโหลโดยผู้เขียนหลายสิบคน แต่มีเพียงไม่กี่คนที่เขียนเรื่องนี้อย่างชัดเจนเหมือนที่เจฟฟ์ทำ โปรดแก้ไขในบทความเมื่อคุณพบ