อัลกอริทึมการแฮชที่“ ปลอดภัย” คืออะไร


19

หลังจากอ่านคำถามที่น่าสนใจนี้ฉันรู้สึกว่าฉันมีความคิดที่ดีว่าอัลกอริทึมการแปลงแป้นพิมพ์ที่ไม่ปลอดภัยที่ฉันใช้ถ้าฉันต้องการ แต่ฉันไม่รู้ว่าทำไมฉันจึงอาจใช้อัลกอริทึมที่ปลอดภัยแทน

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


8
คำถามนี้เหมาะสำหรับไซต์IT Security SE
เบอร์นาร์ด

@Bernard หากเป็นเช่นนั้นฉันก็ไม่เป็นไร แต่คำถามของฉันไม่ได้เกี่ยวกับวิธีการใช้แฮชที่ปลอดภัยหรือเมื่อไร แต่สิ่งที่แตกต่างจากอัลกอริทึมการแฮชที่ปลอดภัยจากที่ไม่ปลอดภัย ดูเหมือนว่าจะเป็นคำถามการเขียนโปรแกรมสำหรับฉัน แต่ฉันไม่ได้ดู IT Security SE ดังนั้นอาจใช้งานได้เช่นกัน
CodexArcanum

2
คำถามที่คล้ายกันมากได้รับการถามในการรักษาความปลอดภัยไอที
ChrisF

คำตอบ:


34

มีคุณสมบัติสามอย่างที่เราต้องการจากทุกฟังก์ชั่นการเข้ารหัสลับH:

  • ต้านทาน preimage : ให้hมันควรจะเป็นเรื่องยากที่จะหาค่าใด ๆด้วยxh = H(x)

  • ต้านทาน preimage ที่สอง : ให้x1มันควรจะเป็นเรื่องยากที่จะพบกับx2 != x1H(x1) = H(x2)

  • ต้านทานการชน : มันควรจะยากที่จะหาค่าทั้งสองด้วยx1 != x2H(x1) = H(x2)

ด้วยฟังก์ชั่นแฮชที่ใช้ในภาษาการเขียนโปรแกรมทั่วไปสำหรับตารางแฮช (ของสตริง) โดยปกติจะไม่มีการกำหนดสิ่งเหล่านี้

  • การต้านทานการชนที่อ่อนแอ : สำหรับค่าที่เลือกแบบสุ่มของโดเมน (หรือ "โดยทั่วไป") โอกาสในการชนจะน้อย สิ่งนี้ไม่ได้เกี่ยวกับผู้โจมตีโดยเจตนาพยายามสร้างการชนหรือพยายามค้นหาคำนำหน้า

คุณสมบัติทั้งสามด้านบนคือ (ในหมู่) เป้าหมายการออกแบบสำหรับทุกฟังก์ชันแฮชการเข้ารหัส สำหรับบางฟังก์ชั่น (เช่น MD4, SHA-0, MD5) เป็นที่ทราบกันดีว่านี่ล้มเหลว (อย่างน้อยก็บางส่วน) รุ่นปัจจุบัน (SHA-2) จะถือว่าเป็นที่เชื่อถือได้และเป็นคนถัดไป ( "การรักษาความปลอดภัยแฮอัลกอริทึม 3") ขณะนี้อยู่ในกระบวนการของการได้มาตรฐานหลังจากการแข่งขัน

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

  • การดำเนินการช้า : ให้xมันใช้เวลาอย่างน้อยบางส่วน (ที่กำหนดดีกว่า) H(x)ปริมาณของทรัพยากรในการคำนวณค่า

แต่สำหรับการใช้งานอื่น ๆ ส่วนใหญ่สิ่งนี้ไม่ต้องการสิ่งหนึ่งต้องการ:

  • การดำเนินการที่รวดเร็ว : ได้รับการxคำนวณค่าของH(x)จะเร็วที่สุด (ในขณะที่ยังคงปลอดภัย)

มีสิ่งปลูกสร้างบางอย่าง (เช่น PBKDF2 และ scrypt) เพื่อสร้างฟังก์ชั่นแฮชช้าจากอันรวดเร็วโดยการวนซ้ำบ่อยครั้ง

สำหรับรายละเอียดเพิ่มเติมดูที่แท็กแฮชใน Cryptography Stack Exchange ของเว็บไซต์น้องสาวของเรา


3

การรักษาความปลอดภัยหมายถึงคนที่ต้องการชักนำให้คุณเกิดข้อผิดพลาดโดยใช้การชน (เช่นความจริงที่ว่าแหล่งที่มาสองแหล่งถูกแฮชให้เป็นค่าเดียวกัน) จะมีปัญหา

ลักษณะบางอย่าง:

  • การรู้จักแฮชการสร้างไฟล์ที่แฮชกับค่านั้นเป็นเรื่องยาก (ตัวแปรส่วนหนึ่งของไฟล์ใหม่จะได้รับเช่นเดียวกับแฮชที่ต้องการ)

  • การสร้างไฟล์ที่แตกต่างกันสองไฟล์ซึ่งแฮชไปที่ค่าเดียวกันนั้นเป็นเรื่องยาก (ตัวแปรส่วนหนึ่งของไฟล์จะได้รับ)


3

ความแตกต่างหลักนั้นค่อนข้างง่าย: แฮชปกติมีไว้เพื่อลดจำนวนการชนโดยไม่ตั้งใจให้มากที่สุดเท่าที่จะทำได้โดยไม่ทำให้กระบวนการทั้งหมดช้าลง

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

สำหรับตัวอย่างหลัง: หากคำนวณแฮชจะใช้เวลา 50 ms จะไม่มีผลกระทบต่อเนื้อหาในการเข้าสู่ระบบของผู้ใช้ปกติ (เช่นผู้ใช้ส่วนใหญ่จะไม่สังเกตเห็นความแตกต่างของ 50ms เมื่อเข้าสู่ระบบ) ในเวลาเดียวกันหากผู้โจมตีต้องการโจมตีพจนานุกรมความสามารถในการสร้างแฮชเพียง 20 แฮ็คต่อวินาทีเป็นแต้มต่อร้ายแรง กล่าวอีกนัยหนึ่งด้วยเหตุผลบางอย่างสำหรับแฮชที่ปลอดภัยช้ากว่าจะดีกว่า


3
ในโดเมนของฟังก์ชันแฮชการเข้ารหัสมีกลุ่มย่อยที่สำคัญสองกลุ่ม: กลุ่มที่รวดเร็ว (ใช้สำหรับการตรวจสอบข้อความลายเซ็นและอื่น ๆ ) และกลุ่มที่ช้า - ใช้สำหรับการรับรหัสและการแฮ็กรหัสผ่าน อย่าผสมสิ่งเหล่านี้มีแอปพลิเคชันสำหรับทั้งคู่
Paŭlo Ebermann

ที่จริงแล้วยังมีฟังก์ชั่นแฮชซึ่งออกแบบมาเพื่อเพิ่มการชนสูงสุด : Soundex เป็นตัวอย่าง เห็นได้ชัดว่านี่เป็นฟังก์ชันแฮชที่ปลอดภัยมาก
Jörg W Mittag

@ JörgWMittag: ไม่เพียง แต่เส็งเคร็งในฐานะแฮชที่มีความปลอดภัย แต่มันก็ค่อนข้างยากจนสำหรับใช้กับตารางแฮช จากนั้นอีกครั้งในขณะที่ค่อนข้างคล้ายแฮชฉันลังเลที่จะเรียกใช้ฟังก์ชันแฮช Soundex เพียงเพราะความตั้งใจและการใช้งานนั้นแตกต่างจากฟังก์ชั่นแฮชทั่วไปอย่างทั่วถึง
Jerry Coffin

@JerryCoffin: ฉันคิดว่ามันขึ้นอยู่กับความหมาย เช่นหน้าวิกิพีเดียภาษาอังกฤษเพียงแค่บอกว่าฟังก์ชั่นแฮชคืออัลกอริธึมหรือรูทีนย่อยใด ๆ ที่แมปชุดของค่าที่กำหนดเองได้มากขึ้น ในขณะที่หน้าวิกิพีเดียภาษาเยอรมันบอกว่า "hashing" (เยอรมัน: "zerhacken") เป็นส่วนที่สำคัญนั่นคือการหลีกเลี่ยงการชนและการกระจายของค่าที่แมปเป็นกุญแจสำคัญ Soundex ตอบสนองความหมายแรกมาก แต่ไม่ใช่คำที่สอง
Jörg W Mittag

3

อ่านhttp://www.codinghorror.com/blog/2012/04/speed-hashing.htmlมันจะอธิบายทุกอย่างได้ดีกว่าที่ฉันเคยอธิบาย นี่คือส่วนหัวที่สำคัญที่สุดสองข้อในบทความที่ตอบคำถามของคุณโดยตรง:

  • แฮชที่ปลอดภัยได้รับการออกแบบมาเพื่อป้องกันการงัดแงะ
    • เปลี่ยนเอาต์พุตของมันอย่างรุนแรงด้วยการเปลี่ยนแปลงเพียงเล็กน้อยในข้อมูลอินพุต
  • แฮชที่ปลอดภัยได้รับการออกแบบให้ช้า

TL ของเขาส่วน DR ตอนท้าย:

หากคุณเป็นผู้ใช้:

ตรวจสอบให้แน่ใจว่ารหัสผ่านทั้งหมดของคุณมีความยาว 12 ตัวอักษรหรือมากกว่า ฉันขอแนะนำให้ใช้วลีรหัสผ่านซึ่งไม่เพียง แต่จดจำได้ง่ายกว่ารหัสผ่าน (ถ้าไม่ใช่ประเภท) แต่ยังปลอดภัยกับสัตว์เดรัจฉานบังคับให้หมดจดเนื่องจากความยาวของพวกเขา

หากคุณเป็นผู้พัฒนา:

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


4
Jeff ผิดที่นี่ในจุดที่สอง ... ในขณะที่สำหรับการใช้งานบางอย่าง (เช่นการแฮ็นรหัสผ่านและการสืบทอดคีย์จากรหัสผ่าน) คุณต้องการช้าสำหรับการใช้งานอื่น ๆ (เช่นการตรวจสอบข้อความลายเซ็น ฯลฯ ) รวดเร็ว (ปลอดภัย) ฟังก์ชั่นแฮชดี
Paŭlo Ebermann

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

2
@ เนท“ มีความปลอดภัยมากขึ้น” เป็นสิ่งที่คลุมเครืออยู่เสมอ แต่แม้จะอยู่ภายใต้แอปพลิเคชั่นที่เป็นกุศลมากที่สุดก็ตาม มีแอปพลิเคชั่นมากมายที่ความเร็วของแฮชไม่เกี่ยวข้อง
Gilles 'หยุดชั่วร้าย'

@Gilles คุณสามารถยกตัวอย่างได้หรือไม่? ที่จริงฟังดูฉัน แต่เฉพาะเจาะจงมากขึ้นจะเป็นประโยชน์
เนท

2
@Nate แอปพลิเคชั่นแฮชที่ชัดเจนที่สุดคือการตรวจสอบความถูกต้องของข้อมูล: ส่งแฮชผ่านแชนเนลที่ปลอดภัย แต่อาจมีแบนด์วิธต่ำช่องสัญญาณส่ง payload ขนาดใหญ่บนช่องที่ไม่ปลอดภัยจากนั้นตรวจสอบว่า กัญชา. แฮชยังมีวิธีการลงชื่อที่เด่นชัด (ซึ่งคุณไม่เพียง แต่ตรวจสอบความถูกต้อง แต่ยังรวมถึงผู้ที่ส่งข้อมูลถึงคุณด้วย) รหัสผ่านการแฮชค่อนข้างเป็นข้อยกเว้น
Gilles 'หยุดชั่วร้าย'

2

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

โดยทั่วไปแล้วแฮ็กจะถือว่า "ปลอดภัย" หากได้รับข้อความ M, ฟังก์ชันแฮช () และค่าแฮชที่ผลิตโดยแฮช (M) ที่มีความยาวเป็นบิต L ไม่มีสิ่งใดต่อไปนี้ที่สามารถทำได้ในน้อยกว่าเวลา O (2 L ):

  • ได้รับ hash () และ H สร้าง M (ต้านทานแบบ preimage)
  • ได้รับ hash () และ M ทำให้เกิด M 2 ที่ต่างกันเช่น hash (M 2 ) == H (ความต้านทานการชนที่อ่อนแอ)
  • ได้รับ hash () ผลิต M 1และ M 2 แบบใดก็ได้ที่ hash (M 1 ) == hash (M 2 ) (ความต้านทานการชนที่แข็งแกร่ง)

นอกจากนี้แฮชที่ "ปลอดภัย" จะต้องมีแฮชที่มีความยาว L ซึ่งเท่ากับ 2 Lไม่ใช่จำนวนขั้นตอนที่เป็นไปได้สำหรับคอมพิวเตอร์ที่จะดำเนินการกับฮาร์ดแวร์ปัจจุบันที่กำหนด แฮชจำนวนเต็มแบบ 32 บิตสามารถมีค่าได้ 2.1 พันล้านเท่านั้น ในขณะที่การโจมตี preimage (การค้นหาข้อความที่สร้างแฮช H) จะใช้เวลาสักครู่ แต่ก็ไม่สามารถทำได้สำหรับคอมพิวเตอร์หลาย ๆ เครื่องโดยเฉพาะอย่างยิ่งผู้ที่อยู่ในมือของหน่วยงานรัฐบาลที่ได้รับอนุญาตให้ใช้รหัสผิดพลาด นอกจากนี้อัลกอริทึมที่สร้างและจัดเก็บข้อความแบบสุ่มและแฮชของพวกเขาจะมีช็อต 50% ในการค้นหาแฮชซ้ำกับแต่ละข้อความใหม่หลังจากลองเพียง 77,000 ข้อความและจะมีโอกาส 75% ที่จะตี ซ้ำหลังจาก 110,000 เท่านั้น แม้แฮชแบบ 64 บิตยังคงมีโอกาส 50% ที่จะชนกันหลังจากลองใช้ค่าประมาณ 5 พันล้านเท่านั้น นั่นคือพลังของการโจมตีวันเกิดจากแฮชขนาดเล็ก ตรงกันข้าม,ตัวเลขdecillion (1.5 * 10 34 )

การโจมตีส่วนใหญ่ที่แสดงถึงการเข้ารหัสลับนั้นเป็นการโจมตีแบบชนกันและได้แสดงให้เห็นถึงความสามารถในการสร้างข้อความที่ขัดแย้งกันในเวลาน้อยกว่า 2 L (ส่วนใหญ่ยังคงเป็นแบบ exponential-time แต่การลดเลขชี้กำลังเป็นครึ่ง แฮชแบบ 256 บิตเป็นเรื่องง่ายที่จะแก้ปัญหาเช่นเดียวกับ 128 บิต, 128 บิตเป็นเรื่องง่ายที่จะแก้ปัญหาเช่น 64 บิต ฯลฯ )

นอกเหนือจากขนาดแฮชขนาดเล็กปัจจัยอื่น ๆ ที่สามารถทำให้แฮชที่ไม่ปลอดภัยสามารถพิสูจน์ได้คือ:

งานต่ำ - แฮชที่ออกแบบมาเพื่อใช้งานโดย hashtable หรือสำหรับวัตถุประสงค์อื่น ๆ "เช็คซัม" ประเภทอื่น ๆ มักจะได้รับการออกแบบให้มีราคาไม่แพง นั่นทำให้การโจมตีแบบเดรัจฉานบังคับง่ายกว่ามาก

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

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


0

ใช้อัลกอริทึมที่เหมาะสมสำหรับงานในมือ

ซีอาร์ซีใช้สำหรับการตรวจจับ / แก้ไขข้อผิดพลาด

ข้อความย่อยการเข้ารหัสลับเช่น SHA2 ถูกใช้เป็นแบบเอกสารสำเร็จรูปสำหรับการสร้างการเข้ารหัสลับ (ลายเซ็นดิจิทัล, MAC, ฟังก์ชันการแฮ็กคีย์ / การเข้ารหัสรหัสผ่าน) และโปรโตคอลความปลอดภัย

ในตารางแฮช / พจนานุกรม / แผนที่ใช้SipHash

สิ่งที่คุณเรียกว่าอัลกอริทึมการแฮชที่ไม่ปลอดภัยไม่ควรใช้ในตารางแฮชดังที่พิสูจน์แล้วโดยรายการ CVE ต่อไปนี้: CVE-2003-0364, CVE-2011-4461, CVE-2011-4838, CVE-2011-4885, CVE-2011- 4462, CVE-2011-4815, CVE-2012-0840, CVE-2012-5371 , CVE-2012-5374, CVE-2012-5375

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