การใช้ bcrypt(md5(pwd) + salt) ถือเป็นแนวปฏิบัติที่ไม่ดีหรือไม่?

ฉันกำลังพยายามแชร์การเข้าสู่ระบบระหว่างแอปของฉันกับฟอรัม IPB

ฉันเห็นว่า Invision กำลังจัดเตรียมโมดูลเพื่อแบ่งปันข้อมูลรับรอง: การเชื่อมต่อ IPS

เพื่อให้ง่าย มีแอปพลิเคชันหลักและทาสหนึ่งหรือหลายรายการ สเลฟกำลังส่งข้อมูลประจำตัวที่มาสเตอร์จำเป็นต้องจัดเก็บผ่าน API

ประเด็นก็คือสำหรับวิธี register หรือ login IPB กำลังส่งแฮชรหัสผ่าน md5 ไม่มีทางที่ฉันจะเก็บ md5 ไว้ใน db ของฉัน ดังนั้นฉันคิดว่าจะใช้ bcrypt บนแฮช md5 ทำบางอย่างเช่น

$storedPassword = bcrypt(md5(pwd) + salt);

คุณคิดอย่างไรเกี่ยวกับทางเลือกนี้ เป็นการดีหรือไม่ที่จะแฮชด้วย bcrypt ทับแฮช md5


person darkheir    schedule 06.05.2013    source แหล่งที่มา
comment
ความคิดที่ไม่ดี การแฮชหลายครั้งจะเพิ่มโอกาสที่จะชนกัน   -  person Daniel Mensing    schedule 06.05.2013
comment
ฉันได้ยินมา แต่มันเพิ่มโอกาสที่จะชนกันอย่างกว้างขวางหรือไม่?   -  person darkheir    schedule 06.05.2013
comment
ผู้ใช้สองคนสามารถใช้รหัสผ่านเดียวกันก่อนที่จะแฮชได้ ดังนั้นจึงไม่ใช่เรื่องสำคัญสำหรับการชนกัน และโอกาสที่ผู้ใช้สองคนจะใช้รหัสผ่านที่แตกต่างกันและแฮช md5 เดียวกันนั้นแทบจะไม่มีอะไรเลย   -  person Hugo Delsing    schedule 06.05.2013
comment
@DanielMensing แค่สงสัยจริงๆ อะไรทำให้คุณคิดอย่างนั้น?   -  person likeitlikeit    schedule 04.06.2013


คำตอบ (2)


แม้ว่าการใช้ $storedPassword = bcrypt(md5(pwd) + salt); ในแอปพลิเคชันของคุณจะใช้งานได้ดีเลิศ แต่ด้านความปลอดภัยก็มีประโยชน์เพียงเล็กน้อย นอกจากนี้ยังไม่จำเป็นต้องเพิ่มเกลือของคุณเองในการเข้ารหัส bcrypt จะดูแลเรื่องนั้นภายในและคุณไม่จำเป็นต้องเก็บเกลือไว้ที่ไหน

ผู้โจมตีกำหนดเป้าหมายลิงก์ที่อ่อนแอที่สุด และหากเซิร์ฟเวอร์อื่นใช้ md5 พวกเขาสามารถโจมตีไซต์นั้นเพื่อรับรหัสผ่าน ไม่สำคัญว่าคุณจะรักษาความปลอดภัยให้แข็งแกร่งแค่ไหน

แต่แล้วอีกครั้ง การปิดประตูหนึ่งยังดีกว่าปล่อยให้ทุกอย่างเปิดอยู่

person Hugo Delsing    schedule 06.05.2013
comment
ใช่ แต่ไซต์อื่นจะไม่จัดเก็บมัน จะส่งเฉพาะรหัสผ่าน (โดยใช้ md5) เมื่อลงทะเบียนหรือเมื่อผู้ใช้พยายามเข้าสู่ระบบ ดังนั้นสำหรับฉัน ลิงก์ที่อ่อนแอน่าจะเป็นการดมการเชื่อมต่อระหว่างเซิร์ฟเวอร์ 2 เครื่อง ณ เวลาที่ส่งข้อมูลรับรอง - person darkheir; 06.05.2013
comment
ถ้าอย่างนั้นแนวทางของคุณก็ใช้ได้ถ้าคุณทิ้งเกลือลงไป สำหรับทุกสิ่งที่คุณสนใจ ผู้ใช้ป้อนตัวอักษร 32 ตัวเป็นรหัสผ่านด้วยตนเอง - person Hugo Delsing; 06.05.2013
comment
เหตุใดฉันจึงต้องหยอดเกลือ? ฉันคิดว่ามันทำให้แฮชมีเอกลักษณ์ใช่ไหม? - person darkheir; 06.05.2013
comment
หากคุณเพิ่มเกลือ คุณจะต้องเก็บเกลือแยกกันในฐานข้อมูลเพื่อให้สามารถตรวจสอบรหัสผ่านที่ถูกต้องได้ อย่างไรก็ตาม bCrypt มีเกลือในตัว ไม่จำเป็นต้องเพิ่มมัน ดู stackoverflow.com/questions/ 6832445/ หรือ en.wikipedia.org/wiki/Bcrypt - person Hugo Delsing; 06.05.2013

สิ่งนี้ลดความปลอดภัย

แฮช MD5 มักจะทำให้รหัสผ่านสั้นลง ซึ่งหมายความว่าผู้โจมตีจำเป็นต้องวนซ้ำพื้นที่ MD5 เท่านั้น แม้ว่าคุณจะพิจารณาว่าพื้นที่ MD5 มีขนาดใหญ่ แต่ก็เป็นเรื่องเล็กน้อยที่จะแมปพจนานุกรมคำลงไป สิ่งนี้ไม่เพิ่มประโยชน์ใด ๆ แต่อาจลดพื้นที่ลงได้

เกี่ยวกับการชนกัน: คุณไม่ชนะลอตเตอรีกาแล็กซี่ด้วย bcrypt อย่างไรก็ตาม สำหรับ MD5 สิ่งต่างๆ มีความแน่นอนน้อยลงเล็กน้อย ซึ่งเป็นอีกเหตุผลที่ควรหลีกเลี่ยง

คุณไม่จำเป็นต้องเติมเกลือ bcrypt จะเพิ่มเกลือที่ดีและมีเอกลักษณ์ในตัวมันเองอยู่แล้ว หากคุณใช้ bcrypt อย่างถูกต้อง คุณไม่จำเป็นต้องคิดถึงเรื่องเกลือเลย

ค่อนข้างแปลกที่แหล่งที่มาของคุณส่งเฉพาะแฮช MD5 เท่านั้น ฉันมักจะแนะนำให้ส่งรหัสผ่าน (ข้อความธรรมดา) ผ่านการเชื่อมต่อที่เข้ารหัส:

  • หากการเชื่อมต่อถูกเข้ารหัส การส่งเป็นข้อความธรรมดาจะปลอดภัย
  • หากไม่ได้เข้ารหัส ก็ไม่สำคัญว่าคุณจะแฮรหัสผ่านก่อนหรือไม่ ผู้โจมตีสามารถอ่านได้จากเครือข่ายอยู่ดี
person mafu    schedule 18.02.2016