SHA512 vs. Blowfish และ Bcrypt [ปิด]


222

ฉันกำลังดูอัลกอริทึมการแปลงแป้นพิมพ์ แต่ไม่พบคำตอบ

  • Bcrypt ใช้ Blowfish
  • ปักเป้าดีกว่า MD5
  • ถาม: แต่ปักเป้าดีกว่า SHA512 หรือไม่

ขอบคุณ ..

ปรับปรุง:

ฉันต้องการชี้แจงว่าฉันเข้าใจความแตกต่างระหว่างการแฮชและการเข้ารหัส สิ่งที่ถามฉันจะถามคำถามแบบนี้เป็นบทความนี้ , ที่ผู้เขียนหมายถึง bcrypt ว่า "การปรับตัวคร่ำเครียด"

เนื่องจาก bcrypt นั้นเป็นพื้นฐานของ Blowfish ฉันจึงถูกนำไปคิดว่า Blowfish นั้นเป็นอัลกอริทึมคร่ำเครียด หากการเข้ารหัสเป็นคำตอบได้ชี้ให้เห็นแล้วดูเหมือนว่าฉันไม่ควรมีที่ในบทความนี้ สิ่งที่แย่กว่านั้นคือเขาสรุปว่า bcrypt นั้นดีที่สุด สิ่งที่ทำให้ฉันสับสนตอนนี้ก็คือคลาส phpass (ใช้สำหรับการแฮ็กรหัสผ่านที่ฉันเชื่อ) ใช้ bcrypt (เช่นปักเป้าการเข้ารหัสเช่น) จากข้อมูลใหม่นี้ที่พวกคุณกำลังบอกฉัน (ปักเป้าเป็นการเข้ารหัส) คลาสนี้ฟังดูผิด ฉันพลาดอะไรไปรึเปล่า?


2
มันไม่ผิดหรอก ดูการอัปเดตคำตอบของฉันสำหรับคำอธิบายว่า bcrypt ทำงานอย่างไรและทำไมมันถึงมีจุดประสงค์เดียวกันกับอัลกอริทึม "one-way" แบบแฮช
erickson

3
bcryptเพียงแค่มี "ปัจจัยการทำงาน" ที่สูงขึ้นตามค่าเริ่มต้น SHA จะถือว่าไม่เป็น ... เว้นแต่ว่าคุณจะใช้ passhash9 ซึ่งสามารถใช้ได้ทั้งกับปัจจัยการทำงาน ทำไมคำถามนี้ปิด มันยังห่างไกลจากคำตอบ แต่สำคัญมาก

1
ลิงก์ในคำถาม
ขัดข้อง

คำตอบ:


320

มันควรจะพอเพียงที่จะบอกว่า bcrypt หรือ SHA-512 (ในบริบทของอัลกอริทึมที่เหมาะสมเช่น PBKDF2) นั้นดีพอดีพอและคำตอบคือใช่อัลกอริทึมอย่างใดอย่างหนึ่งมีความปลอดภัยเพียงพอที่การละเมิดจะเกิดขึ้นผ่านข้อบกพร่องในการใช้งานไม่ใช่การเข้ารหัส

หากคุณยืนยันในการรู้ว่าอะไรคือ "ดีกว่า" SHA-512 มีการรีวิวแบบเจาะลึกโดย NIST และอื่น ๆ เป็นเรื่องดี แต่ข้อบกพร่องได้รับการยอมรับแล้วว่าแม้ว่าจะไม่สามารถใช้ประโยชน์ได้ในขณะนี้ได้นำไปสู่การแข่งขัน SHA-3 สำหรับอัลกอริทึมแฮชใหม่ นอกจากนี้โปรดทราบว่าการศึกษาอัลกอริธึมการแฮชนั้น "ใหม่กว่า" มากกว่ายันต์และ cryptographers ยังคงเรียนรู้เกี่ยวกับมัน

แม้ว่า bcrypt โดยรวมยังไม่ได้รับการตรวจสอบมากพอ ๆ กับ Blowfish แต่ฉันเชื่อว่าการใช้เลขศูนย์ที่มีโครงสร้างที่มีความเข้าใจดีทำให้มีความปลอดภัยโดยธรรมชาติที่การรับรองความถูกต้องแบบแฮชไม่เพียงพอ นอกจากนี้ยังง่ายต่อการใช้ GPU ทั่วไปเป็นเครื่องมือในการโจมตีแฮชที่ใช้ SHA-2 เนื่องจากความต้องการของหน่วยความจำการเพิ่มประสิทธิภาพ bcrypt ต้องใช้ฮาร์ดแวร์พิเศษเช่น FPGA กับแรมในบอร์ด


หมายเหตุ: bcrypt เป็นอัลกอริทึมที่ใช้ Blowfish ภายใน มันไม่ใช่อัลกอริธึมการเข้ารหัสเอง มันถูกใช้เพื่อปิดบังรหัสผ่านที่ไม่สามารถย้อนกลับได้เช่นเดียวกับฟังก์ชั่นแฮชที่ใช้ในการทำ "แฮชทางเดียว"

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

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

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

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

ดังนั้นเช่นเดียวกับอัลกอริทึมที่ไม่สามารถย้อนกลับได้โดยใช้การแยกย่อยแบบเข้ารหัสลับ bcrypt สร้างเอาต์พุตที่ไม่สามารถย้อนกลับได้จากรหัสผ่านเกลือและปัจจัยด้านต้นทุน ความแข็งแกร่งของมันอยู่ในการต่อต้านของ Blowfish ต่อการโจมตีธรรมดาที่รู้จักกันซึ่งคล้ายกับ "การโจมตีก่อนภาพแรก" ในอัลกอริทึมการแยกย่อย เนื่องจากสามารถใช้แทนอัลกอริธึมการแฮชเพื่อปกป้องรหัสผ่าน bcrypt จึงถูกเรียกอย่างสับสนว่าอัลกอริทึม "แฮช"

สมมติว่าตารางรุ้งถูกขัดขวางโดยการใช้เกลืออย่างเหมาะสมฟังก์ชั่นใด ๆ ที่ไม่สามารถย้อนกลับได้อย่างแท้จริงจะลดผู้โจมตีไปสู่การลองผิดลองถูก และอัตราที่ผู้โจมตีสามารถทำการทดลองได้ถูกกำหนดโดยความเร็วของอัลกอริทึม "แฮช" ที่ไม่สามารถย้อนกลับได้ หากใช้ฟังก์ชันแฮชซ้ำหนึ่งครั้งผู้โจมตีสามารถสร้างการทดลองหลายล้านครั้งต่อวินาทีโดยใช้อุปกรณ์ที่มีราคา 1,000 ดอลลาร์ทดสอบรหัสผ่านทั้งหมดที่มีความยาวสูงสุด 8 อักขระในไม่กี่เดือน

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

ดังนั้นข้อเสนอแนะของฉันเกี่ยวกับ bcrypt นั้นเกิดจากสมมติฐาน 1) ว่า Blowfish มีระดับการตรวจสอบที่คล้ายกันกับฟังก์ชันแฮช SHA-2 และ 2) วิธีการเข้ารหัสลับของ cipanalytic นั้นดีกว่าของฟังก์ชันแฮช


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

17
ฉันไม่คิดว่าจะมีอะไรผิดปกติกับการใช้แบบดั้งเดิมที่ทันสมัยกว่า ช่องโหว่มักจะถูกค้นพบเมื่อเวลาผ่านไปและ Twofish ได้รับการพัฒนาโดยใช้ความรู้ที่ได้จาก Blowfish อย่างไรก็ตามฉันไม่ทราบถึงช่องโหว่ที่เฉพาะเจาะจงซึ่งจะทำให้การใช้งาน Blowfish เป็นโมฆะดังนั้นอาจมีการโต้แย้งว่า สุภาษิตของคุณเกี่ยวกับการโจมตีไม่ได้ฟังดูดีสำหรับฉัน แม้ว่าคุณจะเลือกอัลกอริทึมที่ต้องใช้เวลาหลายปีสำหรับผู้โจมตีในการทดสอบรหัสผ่านนับพันล้านครั้ง แต่รหัสดังกล่าวจะใช้เวลาเพียงเล็กน้อยในแอปพลิเคชันที่ถูกกฎหมาย
erickson

15
หากคุณดูข้อมูลจำเพาะของฟังก์ชันแฮชใด ๆ คุณจะไม่เห็นอะไรเกี่ยวกับ "เกลือ" พารามิเตอร์เดียวคือข้อความที่จะถูกย่อย ตรวจสอบข้อมูลจำเพาะของตัวเลขใด ๆ และคุณจะเห็นว่าฟังก์ชั่นเป็นพารามิเตอร์ที่มีคีย์ "เกลือ" ซึ่งอาจ (หรืออาจจะไม่ ) ใช้ร่วมกับแฮชเป็นเพียงส่วนหนึ่งของข้อความ อัลกอริทึมการแฮชไม่ต้องการใช้ไม่ได้จัดการเป็นพิเศษและไม่สามารถแยกความแตกต่างจากข้อความที่เหลือ ดังนั้นแม้ว่าจะเป็นความจริงที่ว่าข้อความมักถูกเปลี่ยนแปลงโดยการเติมเกลือข้อความที่ได้รับจะสร้างแฮชเพียงอันเดียว
erickson

1
@Andre D ในฐานะ pentester ฉันรายงานแอปพลิเคชันที่ล็อคบัญชีและฉันรายงานแอปพลิเคชันที่ไม่ได้ป้องกันการใช้กำลังอย่างดุร้าย ที่อยู่ IP ที่ละเมิดจะต้องแก้ไข captcha นอกจากนี้หากชื่อผู้ใช้มีการกำหนดเป้าหมาย (แม้ว่าจะไม่มีชื่อผู้ใช้นั้น) บัญชีนั้นควรแก้ไข captcha ก่อนที่จะตรวจสอบสิทธิ์ การบังคับใช้การให้สัตยาบันของ X ต่อนาทีก็เป็นที่ยอมรับเช่นกัน ที่เกี่ยวข้อง: security.stackexchange.com/questions/25444/…
rook

2
@rook: ในขณะที่แอปพลิเคชั่นให้สิทธิ์เป็นวิธีปฏิบัติที่ดีคุณอาจสมมติในกรณีนี้ว่าฐานข้อมูลถูกดาวน์โหลดและวางบนอุปกรณ์ที่ไม่มีขีด จำกัด อัตราที่คุณอธิบาย
Ellert van Koperen

50

ผมเห็นด้วยกับคำตอบของเอริกกับหนึ่งข้อแม้: สำหรับวัตถุประสงค์ในการตรวจสอบรหัสผ่าน bcrypt คือไกลดีกว่าย้ำเดียวของ SHA-512 - เพียงเพราะมันอยู่ไกลช้าลง หากคุณไม่เข้าใจว่าทำไมความเชื่องช้าจึงเป็นข้อได้เปรียบในเกมนี้อ่านบทความที่คุณเชื่อมโยงไปอีกครั้ง (เลื่อนลงไปที่ " ความเร็วเป็นสิ่งที่คุณไม่ต้องการในฟังก์ชั่นแฮชรหัสผ่าน ")

แน่นอนคุณสามารถสร้างอัลกอริทึมการแฮ็ชรหัสผ่านที่ปลอดภัยรอบ ๆ SHA-512 โดยวนซ้ำหลายพันครั้งเช่นเดียวกับวิธีการทำงานของอัลกอริทึม MD5 ของ PHK Ulrich Drepper ทำสิ่งนี้อย่างแน่นอนสำหรับห้องใต้ดินของ glibc () ไม่มีเหตุผลพิเศษที่จะทำเช่นนี้หากคุณมีการใช้งาน bcrypt ที่ทดสอบแล้ว


3
หวังว่าคำตอบของฉันจะทำให้ชัดเจนว่าการทำซ้ำแฮชเดียวไม่เพียงพอ (น่าเศร้าแม้แต่ความรู้ขั้นพื้นฐานนี้ก็ไม่สามารถคาดเดาได้) "หากใช้ฟังก์ชั่นแฮชซ้ำหนึ่งรอบผู้โจมตีสามารถสร้างการทดลองหลายล้านครั้งต่อวินาทีโดยใช้อุปกรณ์ที่มีราคา 1,000 ดอลลาร์ทดสอบรหัสผ่านทั้งหมดได้สูงสุด 8 ตัวอักษรในเวลาไม่กี่เดือน คือ 'ป้อนกลับ' เป็นพัน ๆ ครั้งมันจะใช้เวลาหลายร้อยปีในการทดสอบรหัสผ่านชุดเดียวกันบนฮาร์ดแวร์นั้น Bcrypt ได้รับผลกระทบ 'การเพิ่มความแข็งแกร่งที่สำคัญ' โดยการทำซ้ำ… "
erickson

@erickson: ใช่แม้ว่าฉันคิดว่าคุณอาจฝัง lede ที่นั่น ประเด็นที่ฉันพยายามทำคือการเปรียบเทียบโดยตรงของ bcrypt กับ SHA-512 นั้นไม่เกี่ยวข้องกันจริงๆเพราะอย่างหนึ่งคือฟังก์ชั่นที่ได้มาจากกุญแจ
caf


1
การใช้ SHA-512 หลายพันรอบนั้นไม่เคยได้ยินและได้รับการผนวกรวมไว้ในcryptการใช้งานต่าง ๆ(รวมถึงใน PHP ที่ฉันใช้) เมื่อฉันอ่านคำถามดั้งเดิม จริง ๆ แล้วเขาอ้างถึงหลายพันรอบของ SHA-512 เทียบกับ bcrypt ซึ่งใช้การทำซ้ำหลายร้อยหรือหลายพันตัวเอง
thomasrutter

33

ปักเป้าไม่ได้เป็นอัลกอริทึมคร่ำเครียด มันเป็นอัลกอริทึมการเข้ารหัส หมายความว่าคุณสามารถเข้ารหัสสิ่งที่ใช้ปักเป้าและจากนั้นคุณสามารถถอดรหัสกลับเป็นข้อความธรรมดา

SHA512 เป็นอัลกอริทึมการแปลงแป้นพิมพ์ นั่นหมายความว่าเมื่อคุณแฮชอินพุทคุณจะไม่สามารถรับอินพุตต้นฉบับกลับมาได้อีก

พวกมันต่างกัน 2 แบบออกแบบมาเพื่อใช้กับงานที่แตกต่างกัน ไม่มีคำตอบที่ 'ถูกต้อง' สำหรับ"ปลาปักเป้าดีกว่า SHA512 หรือไม่" คุณอาจถามว่า "แอปเปิ้ลดีกว่าจิงโจ้หรือไม่"

หากคุณต้องการอ่านเพิ่มเติมในหัวข้อนี่คือลิงค์บางส่วน:


18
ฉันคิดว่าคำถามเกี่ยวกับการใช้ bcrypt เป็นการป้องกันรหัสผ่านกลับไม่ได้มากเท่าที่ hashing ใช้สำหรับวัตถุประสงค์นั้น
erickson

3
@erickson ข้อความ "Q: แต่ปักเป้าดีกว่า SHA512 เหรอ?" ดูเหมือนจะค่อนข้างชัดเจนสำหรับฉันและแสดงว่า OP ไม่เข้าใจความแตกต่างระหว่างอัลกอริธึม 2 ตัว
เกล็น

1
OP ที่นี่ อันที่จริงตามที่แองเวิร์นของเกลนว่าปักเป้าเป็นอัลกอริทึมการเข้ารหัส (ซึ่งฉันเข้าใจแตกต่างจากการแฮ็ก) ฉันรู้แล้วว่าคำถามของฉันใช่สับสน สิ่งที่สับสนในขณะนี้คือคลาส phpass (ใช้สำหรับการแฮ็กด้วยรหัสผ่านที่ฉันเชื่อ) ใช้ bcrypt (เช่นปักเป้าการเข้ารหัสเช่น) ถ้าปักเป้าเป็นการเข้ารหัสทำไม phpass ใช้มันเพื่อแฮรหัสผ่านดูเหมือนว่ามีข้อบกพร่องสำหรับฉันไม่? ฉันพลาดอะไรไปรึเปล่า?
Chris

2
อย่างไรก็ตามคำถามจะถามว่าแอปเปิ้ลและจิงโจ้ตัวใดที่เหมาะกับงานเฉพาะมากกว่า ปักเป้าเป็นฟังก์ชั่นคร่ำครวญที่ดีกว่า Sha เพราะเวลาที่ใช้ทำแฮช การนำไปใช้ส่วนใหญ่ของ sha ที่ฉันเคยเห็นนั้นรวดเร็วมาก คุณต้องการอัลกอริทึมช้าสำหรับการแฮ็กรหัสผ่าน
John Nicholas

คำตอบนี้ถูกต้องว่า Blowfish เป็นอัลกอริทึมการเข้ารหัส แต่ในบริบทนี้ (เช่นเมื่อใช้ในbcrypt) มันถูกใช้เป็นอัลกอริทึมการแปลงแป้นพิมพ์โดยรับคีย์จากสตริงต้นฉบับและใช้เพื่อเข้ารหัสหมายเลขเวทย์ สิ่งนี้ทำให้ฟังก์ชั่นการแปลงกลับไม่ได้ คุณไม่สามารถคำนวณคีย์จากรหัสได้แม้ว่าคุณจะรู้ข้อมูลธรรมดาและการเข้ารหัส
thomasrutter

4

ปักเป้าไม่ดีไปกว่า MD5 หรือ SHA512 เนื่องจากมันมีจุดประสงค์ที่แตกต่างกัน MD5 และ SHA512 เป็นอัลกอริทึมการแฮช, Blowfish เป็นอัลกอริทึมการเข้ารหัส สองฟังก์ชั่นการเข้ารหัสลับที่แตกต่างกันอย่างสิ้นเชิง


2

ฉันจะแนะนำการใช้ crypt แบบอิง SHA-256 / SHA-512 ของ Ulrich Drepper

เรารังเพลิงขั้นตอนวิธีการเหล่านี้เพื่อ Java, และคุณสามารถหารุ่นที่ได้รับใบอนุญาตได้อย่างอิสระของพวกเขาที่ftp://ftp.arlut.utexas.edu/java_hashes/

โปรดทราบว่า Unices ที่ทันสมัยที่สุด (L) รองรับอัลกอริทึมของ Drepper ในไฟล์ / etc / shadow


PWDTK sourceforge.net/projects/pwdtknetใช้ HMAC- SHA512 อย่างไรก็ตามมันทำซ้ำหลาย ๆ อย่างเพื่อสร้าง "ความช้า" หรือที่รู้จักในชื่อ Key Stretching เหมือนกับที่คนอื่น ๆ กำลังพูดถึง BCrypt นั้นดีกว่า SHA-512 เดียวตามที่ได้กล่าวไว้อย่างไรก็ตามถ้าคุณใช้ SHA-512 ในบางสิ่งเช่น PBKDF2 คุณจะปลอดภัยดี (ตราบใดที่คุณใช้เกลือ crypto แบบสุ่มขนาดใหญ่และมีการทำซ้ำมากพอที่จะบังคับเวลาให้ ทำให้ตารางรุ้ง) API ที่ผมเพิ่งโพสต์ที่ถูกสร้างขึ้นโดยฉันและจะทำในสิ่งที่คุณต้องการใน .NET ถ้านั่นคือสิ่งที่คุณกำลังพัฒนา (เพื่อประโยชน์ของผู้อ่านในอนาคต)
thashiznets

2

ฉันเพิ่งเจอสิ่งนี้:

http://codahale.com/how-to-safely-store-a-password/

ผู้เขียนบทความนี้ผิดหรือเปล่า?


2
ไม่ใช่ว่าเขาผิด แต่เป็นเพียงว่าเขาไม่สนใจวรรณกรรมมากมายเกี่ยวกับวิธีใช้อัลกอริทึมแฮช ได้แก่ ควรใช้อย่างซ้ำ ๆ ในฟังก์ชันการสืบทอดคีย์เช่นเดียวกับ bcrypt
erickson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.