ความแตกต่างระหว่างการแฮชรหัสผ่านและการเข้ารหัส


140

คะแนนสูงสุดของปัจจุบันสำหรับคำถามนี้ระบุว่า:

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

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


บทความที่เขียนขึ้นอย่างดีเกี่ยวกับสาเหตุที่คุณไม่ควรแฮชลับ / รหัสผ่านของคุณ ใช้ HMAC แทน benlog.com/articles/2008/06/19/dont-hash-secrets
Jay Kumar

สรุปยอดเยี่ยมของหัวเรื่องในบล็อกความปลอดภัย StackExchange: security.blogoverflow.com/2011/11/…
David J. Liszewski

@JayKumar: บทความที่คุณเชื่อมโยงนั้นทำให้เข้าใจผิดมาก มันเปิดเผยรหัสผ่านเกลือ (ซึ่งคาดว่าจะปรากฏแก่ผู้โจมตี) ด้วยคีย์ MAC (ซึ่งคาดว่าจะยังคงเป็นความลับ) ลิงก์ของ David J. Liszewski ให้คำอธิบายที่แม่นยำยิ่งขึ้น
Rufflewind

คำตอบ:


222

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

การเข้ารหัสเป็นฟังก์ชันที่เหมาะสม (สองทาง) มันสามารถย้อนกลับได้คุณสามารถถอดรหัสสตริง mangled เพื่อรับสตริงต้นฉบับได้ถ้าคุณมีคีย์

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

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


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

11
ใช่และไม่ใช่ ... การแฮชจะต้องสร้างยากเพื่อความปลอดภัยของแอปพลิเคชันของคุณ แต่การไม่สามารถย้อนกลับได้ก็เพียงพอสำหรับการหลีกเลี่ยงการรั่วไหลของรหัสผ่าน
Dave Sherohman

5
ซิลกี้: แล้วคุณจะได้รหัสผ่านเดิมจากฟังก์ชั่นแฮชหมัดของคุณได้อย่างไร? ฉันแนะนำให้คุณอ่านความคิดเห็นของ Dave อีกครั้ง
Vinko Vrsalovic

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

1
เกลือของ @n00b ไม่สามารถเข้ารหัสได้ยากเพราะทุกรายการที่แฮชควรใช้เกลือแยกต่างหาก จุดสำคัญคือถ้าทั้ง UserA และ UserB ใช้รหัสผ่าน "1234" หากคุณค้นหารหัสผ่านของ UserA คุณไม่สามารถบอกได้ว่า UserB ใช้รหัสผ่านเดียวกันเพราะพวกเขามีเกลือที่แตกต่างกัน การรักษาความปลอดภัยไม่ใช่สิ่งสำคัญที่เกลือจะถูกเก็บเป็นความลับการใช้งานส่วนใหญ่เพียงแค่เชื่อมต่อเกลือเข้ากับด้านหน้าหรือด้านหลังของไบนารีหยดที่แสดงถึงการแฮช
Scott Chamberlain

34

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

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

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


12

Encrypted vs Hashed Passwords

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


สกัดจากEncrypted vs Hashed Passwords - อันไหนดีกว่ากัน?

การเข้ารหัสเป็นสิ่งที่ดีหรือไม่?

รหัสผ่านข้อความธรรมดาสามารถเข้ารหัสได้โดยใช้อัลกอริธึมการเข้ารหัสแบบสมมาตรเช่น DES, AES หรืออัลกอริธึมอื่น ๆ และเก็บไว้ในฐานข้อมูล ที่การรับรองความถูกต้อง (ยืนยันตัวตนด้วยชื่อผู้ใช้และรหัสผ่าน) แอปพลิเคชันจะถอดรหัสรหัสผ่านที่เข้ารหัสที่เก็บไว้ในฐานข้อมูลและเปรียบเทียบกับรหัสผ่านที่ผู้ใช้ให้เพื่อความเท่าเทียมกัน ในวิธีการจัดการรหัสผ่านประเภทนี้แม้ว่าบางคนเข้าถึงตารางฐานข้อมูลรหัสผ่านจะไม่สามารถนำมาใช้ซ้ำได้ อย่างไรก็ตามมีข่าวร้ายในแนวทางนี้เช่นกัน หากมีใครบางคนได้รับอัลกอริทึมการเข้ารหัสลับพร้อมกับคีย์ที่ใช้โดยแอปพลิเคชันของคุณเขา / เธอจะสามารถดูรหัสผ่านผู้ใช้ทั้งหมดที่เก็บอยู่ในฐานข้อมูลของคุณโดยการถอดรหัส "นี่เป็นตัวเลือกที่ดีที่สุดที่ฉันได้รับ" ผู้พัฒนาซอฟต์แวร์อาจกรี๊ด แต่มีวิธีที่ดีกว่านี้หรือไม่

ฟังก์ชันแฮชการเข้ารหัส (แบบทางเดียวเท่านั้น)

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


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

8

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


8

อัลกอริธึมการแฮ็กมักจะเข้ารหัสลับตามธรรมชาติ แต่ความแตกต่างหลักคือการเข้ารหัสสามารถย้อนกลับได้ด้วยการถอดรหัสและการแฮ็กไม่ใช่

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

ฟังก์ชั่นการแปลงแป้นพิมพ์จะรับอินพุตและสร้างเอาต์พุตขนาดเล็กกว่าปกติโดยทั่วไปจะมีขนาดคงที่เช่นกัน

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

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

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


4

เป็นการดีที่คุณควรทำทั้งสองอย่าง

ก่อนแฮรหัสผ่านสำหรับการรักษาความปลอดภัยทางเดียว ใช้เกลือเพื่อความปลอดภัยเป็นพิเศษ

จากนั้นเข้ารหัสแฮชเพื่อป้องกันการโจมตีจากพจนานุกรมหากฐานข้อมูลรหัสผ่านแฮชของคุณถูกบุกรุก


3
เข้ารหัสด้วยอะไร หากพวกเขา pwned คุณอย่างหนักจนพวกเขาไปถึงฐานข้อมูลด้วยรหัสผ่านของผู้ใช้ของคุณ (แฮชเข้ารหัสหรืออื่น ๆ ) พวกเขาจะไม่สามารถหากุญแจเพื่อถอดรหัสพวกเขาได้หรือไม่
ลัค

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

@Luc ฉันไม่เห็นด้วยกับคุณตัวเองก่อนหน้าของฉัน ฉันเห็น SQL-injections มากเกินไปซึ่งไม่ได้ประนีประนอมรหัสแอปพลิเคชัน (หรือไฟล์การกำหนดค่า) และตอนนี้ฉันเห็นว่าการเพิ่มความลับมีประโยชน์ไม่ว่าจะในรูปแบบของการเข้ารหัสหรือในรูปแบบของพริกไทย แต่จะต้องไม่แทนที่ hashing สำหรับคำตอบที่สมบูรณ์ยิ่งขึ้นดูที่นี่: security.stackexchange.com/a/31846/10863
Luc

3

Hashing :

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

การเข้ารหัสลับ

หากเราทำการเข้ารหัสจะมีกุญแจสำคัญในการทำเช่นนี้ หากรหัสนี้จะถูกปล่อยออกมารหัสผ่านทั้งหมดของคุณสามารถถอดรหัสได้อย่างง่ายดาย

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

หากคุณต้องการที่จะดูที่วิธีการที่คุณควรจะเขียนฟังก์ชันแฮชของคุณคุณสามารถเยี่ยมชมได้ที่นี่

มีอัลกอริทึมมากมายที่จะทำการแฮ็ก

  1. MD5 - ใช้ฟังก์ชันแฮช Message Digest Algorithm 5 (MD5) แฮชเอาต์พุตมีความยาว 128 บิต อัลกอริทึม MD5 ได้รับการออกแบบโดย Ron Rivest ในต้นปี 1990 และไม่ใช่ตัวเลือกที่ต้องการในวันนี้

  2. SHA1 - ใช้แฮชอัลกอริทึมแฮชการรักษาความปลอดภัย (SHA1) ที่เผยแพร่ในปี 1995 แฮชเอาต์พุตมีความยาว 160 บิต แม้ว่าจะใช้กันอย่างแพร่หลาย แต่นี่ไม่ใช่ตัวเลือกที่ต้องการ

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 - ใช้ฟังก์ชั่น SHA-256, SHA-384 และ SHA-512 ของตระกูล SHA-2 SHA-2 ถูกตีพิมพ์ในปี 2544 ความยาวแฮชเอาต์พุตคือ 256, 384 และ 512 บิตตามลำดับเนื่องจากชื่อฟังก์ชันแฮชระบุ


1

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


-9

นี่คือเหตุผลหนึ่งที่คุณอาจต้องการใช้สิ่งใดสิ่งหนึ่งเหนือสิ่งอื่น - การดึงรหัสผ่าน

หากคุณเก็บรหัสผ่านของผู้ใช้ไว้เพียงอย่างเดียวคุณจะไม่สามารถเสนอคุณสมบัติ 'ลืมรหัสผ่าน' ได้


16
เห็นได้ชัดว่าคุณไม่ได้อ่านคำตอบที่ยอมรับได้ดีพอ อ่านอย่างระมัดระวัง: คุณไม่ควรเสนอคุณสมบัติการดึงรหัสผ่าน คุณควรจะเสนอคุณสมบัติรีเซ็ตรหัสผ่าน ฉันดูแลเว็บไซต์หลายปีมาแล้วรวมถึง vBulletin, phpBB, e107, IPB, blogspot และแม้แต่ CMS ที่ฉันสร้างขึ้นเอง ในฐานะผู้ดูแลระบบคุณไม่จำเป็นต้องมีรหัสผ่านที่แฮชล่วงหน้าของใครบางคน คุณทำไม่ได้ และคุณไม่ควรมีมันเช่นกัน หากคุณไม่เห็นด้วยกับสิ่งที่ฉันพูดให้ฉันรับรองคุณ: คุณผิด
Lakey

3
ขออภัยที่โกรธเกินไป ฉันเพิ่งเห็นเว็บไซต์จำนวนมากเก็บรหัสผ่านเป็นข้อความธรรมดาและทำให้ฉันหงุดหงิด ตามหมายเหตุ: เว็บไซต์ที่คำนึงถึงความปลอดภัยบางแห่งต้องการให้ผู้ใช้เปลี่ยนรหัสผ่านเป็นระยะ พวกเขาต้องการให้แน่ใจว่าบุคคลนั้นจะไม่เปลี่ยนรหัสผ่านจาก "รหัสผ่าน 1" เป็น "รหัสผ่าน 2" ดังนั้นพวกเขาจึงเก็บรหัสผ่านข้อความธรรมดาเพื่อทำการเปรียบเทียบเหล่านี้ในภายหลัง นั่นไม่ใช่วิธีปฏิบัติที่ดี สิ่งที่พวกเขาต้องทำในกรณีนี้คือทำการวิเคราะห์รหัสผ่านครั้งแรกโดยสร้างรหัสผ่านที่คล้ายกัน - แฮชแต่ละอัน - และเก็บแฮชเท่านั้น
Lakey

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