ฉันควรแฮชรหัสผ่านก่อนส่งไปยังฝั่งเซิร์ฟเวอร์หรือไม่?


110

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


5
@Jader Dias: ฉันรู้ว่าคุณไม่ได้ถามเรื่องนี้ แต่มันจะไม่ปลอดภัยอีกต่อไปถ้าคุณแฮชแล้วส่งผ่าน https ในความเป็นจริงมันอาจทำให้ปลอดภัยน้อยลงเนื่องจากคุณสัมผัสกับเกลือ นอกจากนี้ (พูดถึงด้านหลังของฉันที่นี่) การผสมผสานของอัลกอริทึมอาจทำให้เกิดการชนกันของแฮชมากขึ้นและทำให้แฮ็กได้มากขึ้น
Merlyn Morgan-Graham

@Merlyn "ชนกัญชา" จุดดี!
Jader Dias

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

@JJ "อัลกอริธึมการผสมไม่ได้เพิ่มความน่าจะเป็นในการชนเลย" ฉันอยากเห็นหลักฐานของคำพูดนั้นจริงๆ ให้ฉันหยุดคุณ: นี่เป็นเท็จโดยทั่วไปจะเพิ่มการชนกัน ฉันสามารถสร้างฟังก์ชันแฮชได้อย่างง่ายดายโดยที่ h (x) ไม่ใช่ค่าคงที่ 0 แต่ h (h (x)) = 0 สำหรับ x ทั้งหมด ดังนั้นคุณจะต้องอ้างถึงชุดของอัลกอริทึมการแฮชที่แน่นอนและวิธีการผสม จากนั้นคุณจะต้องพิสูจน์คำพูดของคุณ AFAIK แม้กระทั่ง SHA หลายตัว (พร้อมเกลือ) นี่เป็นปัญหาที่เปิดอยู่ และโดยพื้นฐานแล้วเราเชื่อว่านี่เป็นความจริง การเข้ารหัสเป็นเรื่องยาก
ประหลาด

คำตอบ:


155

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

OP ไม่เคยกล่าวถึงการส่งรหัสผ่านอย่างชัดเจนผ่าน HTTP - เฉพาะ HTTPS แต่ดูเหมือนว่าหลายคนจะตอบคำถามเกี่ยวกับการส่งรหัสผ่านผ่าน HTTP ด้วยเหตุผลบางประการ ที่กล่าวว่า:

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

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

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

ดังนั้นเราจึงมีกุญแจสำคัญ ตอนนี้เราจำเป็นต้องล้างร่องรอยของรหัสผ่านบนอุปกรณ์ไคลเอนต์

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

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

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

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

TL; DR:

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


26
ฉันเพิ่งตรวจสอบ gmail และ facebook - เครื่องมือสำหรับนักพัฒนา Chrome บอกฉันทั้ง POST ด้วยข้อความ urlencoded ที่มีชื่อผู้ใช้และรหัสผ่านของฉันเป็นข้อความธรรมดา (ไม่ใส่เกลือ) ทำไมผู้เล่นรายใหญ่ถึงไม่ใช้ nonce salting กับลูกค้า?
gremwell

18
คุณแฮชคีย์ด้วย nonce และอ้างว่าสามารถย้อนกลับ nonce ที่ฝั่งเซิร์ฟเวอร์ได้ คุณกำลังดุร้ายแฮชหรือไม่? หรือคุณจะดึงข้อมูล nonce ได้อย่างไรเมื่อคุณได้รับ hash = HASH (secret + nonce) HASH ควรเป็นฟังก์ชันที่ไม่สามารถย้อนกลับได้ คุณได้ดำเนินการนี้หรือไม่? ฉันไม่คิดว่าสิ่งที่คุณอธิบายนั้นเป็นไปได้ คุณสามารถสร้างผังงานของโปรโตคอลได้หรือไม่?
เงิน

20
หากคุณไม่ไว้วางใจ HTTPS ทุกความพยายามก็ไร้จุดหมาย! รหัสของคุณถูกส่งผ่านสายและผู้โจมตีสามารถแก้ไข / แทนที่ความพยายามทั้งหมดของคุณในการรักษาความปลอดภัยรหัสผ่านระหว่างการส่ง
Sajid Kalla

3
MitM ที่สามารถเขียนใบรับรองใหม่สามารถเขียน nonce ใหม่ได้ หรือสิ่งที่ซาจิดพูด.
leewz

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

24

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


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

7
@ เจเดอร์: ไม่มีการเล่นซอกับข้อมูลที่จะหยุดการโจมตีของ MITM ได้เนื่องจากมันสามารถถ่ายทอดสิ่งที่เกิดขึ้นได้ ไม่สำคัญว่าคุณกำลังส่งรหัสผ่านหรือแฮช นั่นเป็นเรื่องที่แตกต่างอย่างสิ้นเชิง
David Thornley

2
วัตถุประสงค์ของ SSL (HTTPS = HTTP ผ่าน SSL) คือการขัดขวาง MITM
yfeldblum

1
@carnold - MINTM - แล้วการเปลี่ยนเส้นทางไปยัง http ล่ะ? คนส่วนใหญ่จะสังเกตเห็นหรือไม่? sslstrip - securityfocus.com/brief/910
nate c

1
@Jader Dias คุณพยายามที่จะหยุดปัญหาที่ไม่มีอยู่จริง HTTPS หยุดปัญหานี้แฮชฝั่งไคลเอ็นต์ไม่เพิ่มความปลอดภัยใด ๆ ลูกค้าไม่สามารถเชื่อถือได้
rook

17

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

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

การไม่ใช้ https ถือเป็นการละเมิด OWASP Top 10: A9-Insufficient Transport Layer Protection

แก้ไข: หากในการใช้งานของคุณคุณคำนวณ a sha256(client_salt+plain_text_password)แล้วคำนวณแฮชอื่นในฝั่งเซิร์ฟเวอร์sha256(server_salt+client_hash)นี่ไม่ใช่ช่องโหว่ร้ายแรง อย่างไรก็ตามยังคงมีความอ่อนไหวต่อการดักฟังและเล่นซ้ำคำขอ ดังนั้นนี่จึงยังถือเป็นการละเมิด WASP A9 อย่างชัดเจน อย่างไรก็ตามนี่ยังคงใช้การแยกข้อความเป็นชั้นความปลอดภัย

สิ่งที่ใกล้เคียงที่ฉันได้เห็นการเปลี่ยนฝั่งไคลเอ็นต์สำหรับ https เป็นDiffie-Hellman ในการแลกเปลี่ยนที่สำคัญในจาวาสคริปต์ อย่างไรก็ตามสิ่งนี้จะป้องกันการโจมตี MITM ที่ใช้งานอยู่และด้วยเหตุนี้จนกว่าทางเทคนิคจะละเมิด OWASP A9 ผู้เขียนโค้ดยอมรับว่านี่ไม่ใช่การแทนที่ HTTPS โดยสมบูรณ์ แต่ดีกว่าไม่มีอะไรและดีไปกว่าระบบแฮชฝั่งไคลเอ็นต์


4
อันที่จริงฉันจะแฮชอีกครั้งในเซิร์ฟเวอร์ดังนั้นโปรดแก้ไขคำตอบของคุณโดยพิจารณาสถานการณ์นี้
Jader Dias

@Rook ใช้การแลกเปลี่ยนคีย์ diffie-hellman ร่วมกับ https เป็นการแก้ปัญหาที่ "ไร้ประโยชน์" หรือไม่? (ฉันหมายความว่าเราสามารถใช้ https เท่านั้นและ diffie helman ไม่ได้เพิ่มความปลอดภัย imao)
Michel Gokan

@Michel Kogan การแลกเปลี่ยนคีย์ DH สามารถใช้ใน HTTPs ร่วมกับเครื่องมืออื่น ๆ
rook

1
@ Rook เป็นแนวทางปฏิบัติที่ดีที่สุดในการใช้แฮชบนเซิร์ฟเวอร์ดังนั้นฉันคิดว่าคุณควรอัปเดตจุดเริ่มต้นของคำตอบของคุณเพื่อไม่ให้ยกเลิกการแฮชฝั่งไคลเอ็นต์และจากนั้นจึงพูดถึงว่าไม่ควรเปิดเผยแฮชและเกลือที่เก็บไว้ของเซิร์ฟเวอร์
Levente Pánczél

8

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


2
ดูเหมือนจะเป็นเรื่องไร้สาระทั้งหมด ... แฮชปลอดภัยน้อยกว่ารหัสผ่านอย่างไร?
Levente Pánczél

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

อัปเดต: Digest Access Authentication มีความซับซ้อนยิ่งขึ้น: en.wikipedia.org/wiki/Digest_access_authentication
Hello World

2
เพื่อให้ชัดเจน: เมื่อฉันพูดว่า "เอาชนะวัตถุประสงค์ของการแฮช" ฉันหมายถึงแนวทางปฏิบัติทั่วไปและปลอดภัยในการแฮชรหัสผ่านก่อนที่จะจัดเก็บไว้ในฐานข้อมูล อย่างไรก็ตามอาร์กิวเมนต์ถือได้ว่าการส่งค่าแฮชแทนรหัสผ่านไม่ได้ช่วยเพิ่มความปลอดภัยหากไม่มีขั้นตอนเพิ่มเติม
Paul Keister

เพียงเพื่อเพิ่มสิ่งที่ Paul พูด: การโจมตีแบบนี้เรียกว่า "การโจมตีซ้ำ" หากใครต้องการอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ที่อื่น

5

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

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

เพื่อแก้ปัญหานี้แน่นอนคุณสามารถแฮชที่เซิร์ฟเวอร์ได้รับและเรียกมันว่าวัน

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


3

ใช้ HTTP Digest - รักษารหัสผ่านแม้กระทั่งผ่าน http (แต่การใช้งานที่ดีที่สุดคือ http Digest ผ่าน https)

วิกิพีเดีย:

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

ลิงค์: http://en.wikipedia.org/wiki/Digest_access_authentication

หากคุณต้องการดูการใช้งาน "ในชีวิตจริง" คุณสามารถดูที่ phpMyID ซึ่งเป็นผู้ให้บริการ php openid ที่ใช้การตรวจสอบการแยกย่อย http http://siege.org/phpmyid.php

.. หรือคุณสามารถเริ่มจากตัวอย่าง php auth ที่http://php.net/manual/en/features.http-auth.php

http แยกย่อย rfc: http://www.faqs.org/rfcs/rfc2617

จากการทดสอบของฉันเบราว์เซอร์สมัยใหม่ทั้งหมดรองรับ ...


HTTP Digest ใช้สิ่งที่ฉันหมายถึงในคำถามนี้ แต่เราจะมีประโยชน์หรือไม่ถ้าเราใช้ HTTPS Digest (SSL + HTTP Digest)
Jader Dias

ความแตกต่างที่สำคัญประการหนึ่งคือทุกอย่างจะถูกส่ง / รับที่เข้ารหัส - ส่วนหัว http ส่งและรับและการตอบกลับ html สำหรับคนที่พยายาม "แฮ็ก" ssl แบบสุ่มโดยใช้การโจมตีแบบคนตรงกลาง http ไดเจสต์จะเป็นแรงจูงใจพิเศษที่จะทำให้เขาค้นหาเป้าหมายอื่นที่ง่ายขึ้นหรือถ้าเขาบันทึกการเข้าชมทั้งหมดรหัสผ่านของคุณก็ยังปลอดภัยกว่า ฉันอาจเข้าใจผิดคำถามภาษาอังกฤษไม่ใช่ภาษาแรกของฉัน
ลาดข.

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

3

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

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


"แต่เว็บไซต์ที่มีการทำให้สับสนขั้นพื้นฐาน (ROT13) เช่นกันจะแสดงรหัสผ่านที่ไม่ได้ใช้งานทันที" ซึ่งขัดแย้งกับข้อความเดิม กุญแจสำคัญคือพวกเขาไม่ได้ใช้งานทันที แต่นั่นก็ไร้ประโยชน์จริงๆ รหัสผ่านและ ROT13 เทียบเท่ากัน แต่ถ้าคุณ SHA2 รหัสผ่านรหัสผ่านจะไม่ปรากฏในบันทึก (ดังนั้นผู้ดูแลระบบของคุณจะไม่ทราบรหัสผ่านที่เป็นไปได้ของผู้ใช้กับระบบอื่น ๆ ) และคุณจะไม่ละเมิดกฎหมายความเป็นส่วนตัวเกือบทุกฉบับอีกต่อไป
Levente Pánczél

2

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


พร็อกซีไม่ดักฟังข้อมูลนี้หรือ
Jader Dias

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

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

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

2

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

ทำทั้งสองอย่าง

ทำทั้งสองอย่างเพราะ:

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

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

จริงอยู่ที่พวกเขาสามารถสร้างความเสียหายอื่น ๆ ได้มากมายหากพวกเขามีอิสระในการอ่านสิ่งที่พวกเขาต้องการจากฐานข้อมูลของคุณ

ฉันแค่อยากจะเน้นย้ำตรงนี้ว่าหากคุณตัดสินใจที่จะแฮชคีย์ก่อนออกเดินทางจากลูกค้าของคุณนั่นยังไม่เพียงพอการแฮชแบ็กเอนด์คือ imo สำคัญกว่ามากและนี่คือเหตุผลว่าทำไม: หากมีคนดักฟังการเข้าชมจากคุณ จากนั้นลูกค้าจะเห็นเนื้อหาของpasswordฟิลด์ ไม่ว่าจะเป็นแฮชหรือข้อความธรรมดาก็ไม่สำคัญ - พวกเขาสามารถคัดลอกคำต่อคำเพื่อแอบอ้างเป็นลูกค้าที่ได้รับอนุญาต (เว้นแต่คุณจะทำตามขั้นตอนที่ @ user3299591 ระบุไว้และฉันขอแนะนำให้คุณทำ) ในทางกลับกันการแฮชคอลัมน์ DB เป็นสิ่งจำเป็นและไม่ใช่เรื่องยากที่จะนำไปใช้


1

SSL / TLS ไม่ได้แทนที่ nonce ใช่หรือไม่ ฉันไม่เห็นคุณค่าเพิ่มเติมของสิ่งนี้เนื่องจาก SSL / TLS ยังป้องกันการโจมตีซ้ำ

อ้างอิง https://en.wikipedia.org/wiki/Cryptographic_nonce


กรุณาตรวจสอบstackoverflow.com/questions/3391242/…
Ahmed Hosny

0

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

การใช้ HTTPS จะช่วยป้องกันไม่ให้แฮ็กเกอร์ได้รับรหัสผ่านจากแหล่งเดียวเนื่องจาก HTTPS ใช้สองช่องทางทั้งที่เข้ารหัส


1
อันที่จริงฉันจะแฮชอีกครั้งในเซิร์ฟเวอร์และฉันจะใช้ HTTPS ต่อไปดังนั้นโปรดแก้ไขคำตอบของคุณโดยพิจารณาสถานการณ์นี้
Jader Dias

@ เจเดอร์ประเด็นก็คือผู้โจมตีทั้งหมดต้องการตอนนี้คือแฮชแรกแทนที่จะเป็นรหัสผ่าน ในตอนนี้แฮชที่คุณใช้รหัสผ่านในฝั่งไคลเอ็นต์มีประโยชน์พอ ๆ กับรหัสผ่านเอง ดังนั้นคุณจึงไม่ได้รับความปลอดภัยมากนัก
Peter Recore

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

0

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

สิ่งนี้สามารถมองได้จากมุมมองของการโจมตีสองประเภทประเภทหนึ่งสามารถเข้าถึงการรับส่งข้อมูลเครือข่ายและอีกประเภทหนึ่งสามารถเข้าถึงฐานข้อมูลได้

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

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

แนวคิดที่ควรทราบ:

  • คุณ "เกลือ" แฮชโดยผสมค่าที่ไม่ซ้ำกับขอบเขตบางอย่างกับแฮชของคุณซึ่งโดยทั่วไปจะไม่ซ้ำกันของแถว วัตถุประสงค์คือเพื่อรับประกันความเป็นเอกลักษณ์ของแฮชจากกันและกันแม้ว่าค่าข้อความธรรมดาที่แสดงจะเหมือนกันดังนั้นผู้ใช้สองคนที่มีรหัสผ่านเดียวกันจะยังคงมีแฮชที่แตกต่างกัน ไม่จำเป็นที่จะต้องถือว่าเกลือเป็นความลับ
  • เมื่อตรวจสอบสิทธิ์ให้แฮชบนฝั่งเซิร์ฟเวอร์ทุกครั้งที่คุณส่งผ่านจากไคลเอนต์เป็นรหัสผ่าน (แม้ว่าจะแฮชแล้วก็ตาม) และเปรียบเทียบกับค่าที่แฮชไว้ล่วงหน้าที่เก็บไว้ในฐานข้อมูล สิ่งนี้อาจจำเป็นต้องจัดเก็บรหัสผ่านเดิมในเวอร์ชันแฮชสองครั้ง
  • เมื่อคุณสร้างแฮชให้พิจารณาเพิ่มเกลือเฉพาะเซิร์ฟเวอร์ / คลัสเตอร์ลงในแฮชรวมทั้งเกลือเฉพาะแถวเพื่อป้องกันการจับคู่แฮชที่คำนวณไว้ล่วงหน้าในตารางการค้นหา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.