การเกลือรหัสผ่านของคุณ: แนวทางปฏิบัติที่ดีที่สุด


162

ฉันสงสัยอยู่เสมอ ... จะดีไปกว่ากันถ้าหากฉันใส่รหัสผ่านสำหรับการแฮช: คำนำหน้าหรือ postfix? ทำไม? หรือมันมีความสำคัญตราบใดที่คุณเค็ม?

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

ดังนั้นวิธีใดดีกว่าและทำไม มีวิธีที่ลดโอกาสของการชนกันของแฮชหรือไม่? Googling ของฉันไม่ได้เปิดการวิเคราะห์ที่ดีในเรื่อง

แก้ไข:คำตอบที่ยอดเยี่ยม folks! ฉันขอโทษฉันเลือกได้เพียงคำตอบเดียว :)


1
ดูเพิ่มเติม: stackoverflow.com/questions/1645161/...
Jacco

1
@ Jaccco: อินพุตที่ยอดเยี่ยม ขอบคุณ!
Randolpho

3
แนวทางปฏิบัติที่ดีที่สุดคือการใช้ฟังก์ชั่นการเข้ารหัสที่ทำหน้าที่ช่วยให้คุณได้ใช้ PBKDF2 (มาตรฐาน), bcrypt หรือแม้แต่การเข้ารหัส ขอบคุณสตีเฟ่นที่ชี้ให้เห็นว่า
Maarten Bodewes

1
โครงสร้างการแฮ็ชรหัสผ่านมาตรฐานเกือบทั้งหมดดูแลการรวมเกลือและรหัสผ่านดังนั้นคุณไม่ควรกังวลเกี่ยวกับสิ่งนี้ หากคุณไม่ได้ใช้แฮชรหัสผ่านมาตรฐานให้ย้ายไปที่หนึ่ง
CodesInChaos

1
@Omu คำแนะนำที่ไม่ดี 1) การทำซ้ำ SHA-1 ครั้งเดียวนั้นเร็วเกินไปคุณควรใช้อย่างน้อย 10,000 และแม้จะค่อนข้างอ่อนแอ 2) เกลือเริ่มต้นมีขนาดเล็กเกินไป ต่ำสุด 8 ไบต์และแนะนำให้ 16
CodesInChaos

คำตอบ:


111

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

คุณควรพิจารณาสามสิ่งเหล่านี้:

  1. เกลือนั้นจะต้องแตกต่างกันไปสำหรับรหัสผ่านทุกอันที่คุณเก็บ (นี่เป็นความเข้าใจผิดที่พบบ่อย)
  2. ใช้เครื่องกำเนิดตัวเลขสุ่มที่ปลอดภัย
  3. เลือกเกลือที่มีความยาวพอสมควร คิดเกี่ยวกับปัญหาวันเกิด

Dave Sherohmanมีคำตอบที่ยอดเยี่ยมสำหรับคำถามอื่นว่าทำไมคุณควรใช้เกลือที่สร้างขึ้นแบบสุ่มแทนชื่อผู้ใช้ (หรือข้อมูลส่วนตัวอื่น ๆ ) หากคุณทำตามคำแนะนำเหล่านั้นมันไม่สำคัญว่าคุณจะใส่เกลือไว้ที่ไหน


4
ฉันได้เพิ่มลิงก์ไปยังคำถามเก่าอ่านคำตอบเหล่านั้น โดยพื้นฐานแล้วหากไม่ใช้รหัสสุ่มต่อรหัสอื่นคุณจะเสี่ยงต่อความปลอดภัยโดยไม่จำเป็นซึ่งอาจเป็นปัญหาที่แท้จริงในอนาคต
Georg Schölly

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

3
ใช่เกลือต่อผู้ใช้ เป็นการดีที่มีการบันทึกซ้ำต่อผู้ใช้ (เพื่อให้คุณสามารถเพิ่มจำนวนการวนซ้ำที่ใช้ตลอดเวลา) เฟรมเวิร์กที่เหมาะสมจะมีบิวด์อินนี้ (.NET มี PasswordDeriveBytes ซึ่งจะจัดการทุกอย่างให้คุณ.)
MichaelGG

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

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

27

ฉันคิดว่ามันเป็นความหมายทั้งหมด การวางไว้ก่อนหรือหลังไม่สำคัญยกเว้นการคุกคามรูปแบบเฉพาะ

ความจริงที่ว่ามันควรจะเอาชนะโต๊ะสายรุ้งได้

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

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

อย่างที่ฉันพูด มันเป็นความหมาย เลือกเกลือที่แตกต่างกันต่อรหัสผ่านเกลือที่มีความยาวและรวมถึงตัวอักษรแปลก ๆ เช่นสัญลักษณ์และรหัส ASCII: ©©


@onebyone, แช่ง! เขาค้นพบเกลือของฉัน 'รหัสผ่าน'!
ซามูเอล

6
@Samuel: ฉันไม่รู้เกี่ยวกับพวกคุณ แต่เราใช้ '12345' สำหรับเกลือของเรา :)
Randolpho

@onebyone ถูกต้อง ฉันหมายถึง "ธรรมดา" จริงๆ "เป็นเกลือทั้งหมดที่มีความยาว X ในตัวละคร Y" ซึ่ง X, Y มีเหตุผล; พูด 20 ตัวอักษรและตัวอักษรและตัวเลขบน / ตัวพิมพ์เล็ก ยืดที่จะพูดสตริงเลขฐานสิบหกทั้งหมดภายใต้ความยาว Z (พูด 160) เพราะผมคิดว่าตารางรุ้ง hashes แฮชจะเป็นประโยชน์ ..
ทอมริท

1
@ Randolpho: เฮ้นั่นคือเกลือของฉันเช่นกัน! อัตราต่อรองคืออะไร?
Adrien

และตรวจสอบให้แน่ใจว่าเกลือนั้นไม่สามารถคาดเดาได้ / สุ่ม: stackoverflow.com/questions/1645161/…
Jacco

18

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

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

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


1
เกี่ยวกับย่อหน้าสุดท้าย: ผู้โจมตีจะได้รับข้อมูลใด ๆ เกี่ยวกับจำนวนอักขระที่แน่นอนที่การเปรียบเทียบล้มเหลวได้อย่างไร มันไม่สมเหตุสมผลหรอก ..
halloweenlv

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

9

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


1
การชนของแฮชขึ้นอยู่กับขนาดของแฮช ขอบคุณการชนกันของปัญหาวันเกิดมีแนวโน้มค่อนข้าง
Georg Schölly

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

7

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

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


2
Anwser ผิด: ผู้โจมตีสามารถ precompute MD (รหัสผ่าน) สำหรับรหัสผ่านที่ใช้บ่อยจำนวนมากแล้วคำนวณ MD (รหัสผ่าน + เกลือ) ราคาถูกมากเพราะข้อความย่อยทำงานในลักษณะที่เพิ่มขึ้นเพื่อรองรับการสตรีม
Erwan Legrand

5

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

คุณควรกังวลเกี่ยวกับการแฮชกับตารางการค้นหารหัสผ่านสายรุ้งหรืออย่างอื่น

@ onebyone.livejournal.com:

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

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

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

ยิ่งไปกว่านั้นอัลกอริธึมการแฮ็นรหัสผ่านเช่น PBKDF ประกอบด้วยฟังก์ชันแฮชของพวกเขาหลายครั้ง (แนะนำให้ทำการย้ำ PBKDF-2 อย่างน้อย 1,000 ครั้งต่อการวนซ้ำแต่ละครั้งโดยใช้ SHA-1 สองครั้ง)


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

4

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


3
ดังที่ฉันทราบ BCrypt Hash ต้องการการเติมเกลือเหมือนกับแผนการแฮชอื่น ๆ
Jacco

2

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

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