วิธีใช้ประวัติรหัสผ่านที่ปลอดภัย


23

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

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

ในคำอื่น ๆ : วิธีการใช้กลไกประวัติรหัสผ่านที่ปลอดภัย?


2
ที่เกี่ยวข้อง: security.stackexchange.com/questions/4704/… (และ BTW ไซต์นั้นอาจเป็นตำแหน่งที่ดีกว่าสำหรับคำถามนี้) เท่าที่ 'การเปลี่ยนแปลงขั้นต่ำ' ฉันไม่สามารถนึกถึงทางเลือกอื่นใดในการสร้างตัวเลือกทั้งหมดซึ่งจะถือว่าเป็น 'การเปลี่ยนแปลงขั้นต่ำ' (ซึ่งอาจจะมากขึ้นอยู่กับคำจำกัดความของคุณ!) และเปรียบเทียบแฮช คำจำกัดความของ 'การเปลี่ยนแปลงขั้นต่ำ' คืออะไร?
Kevin Vermeer

7
การจัดเก็บล่าสุดnรหัสผ่านเท่านั้นหมายความว่าผู้ใช้จะเลือกลำดับที่วิ่งจาก 1 ถึง1 + n
Joachim Sauer

11
ฉันสงสัยมากว่านโยบายรหัสผ่านดังกล่าวช่วยเพิ่มความปลอดภัย IMHO จะเพิ่มโอกาสที่ผู้คนจะใช้รหัสผ่านของพวกเขาในบันทึกเหนียว ลิงค์ของ Kevin เป็นการสนทนาที่ดี @KevinVermeer - คุณสามารถวัดปริมาณการเปลี่ยนแปลงได้ตามระยะทางของ Levenshtein ( en.wikipedia.org/wiki/Levenshtein_distance ) หรือที่เรียกว่า "แก้ไขระยะทาง"
นาธานลอง

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

2
@nathan: การจัดเก็บรหัสผ่านในโน้ตช่วยรักษาความปลอดภัยจริง ๆ แล้ว มันเป็นไปไม่ได้ที่จะโจมตีรหัสผ่านนอกจากว่าคุณจะสามารถเข้าถึงบันทึกย่อช่วยเตือนภัยได้โดยไม่ต้องกังวลว่าจะมีการคุกคามถึง 99% ใส่บันทึกย่อนั้นไว้ในกระเป๋าเงินหรือกระเป๋าเงินและโดยทั่วไปคุณต้องทำให้บุคคลนั้นเป็นโมฆะ - หมายความว่ามีการระบุการละเมิดความปลอดภัยและสามารถบรรเทาได้
mattnz

คำตอบ:


22

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

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


ดังนั้นหากผู้ใช้ป้อนรหัสผ่าน 6ฉันควรตรวจสอบส่วนที่เป็นตัวเลขและลองใช้ตัวอย่างเช่นรหัสผ่าน 4 , รหัสผ่าน 5 , รหัสผ่าน 7และอื่น ๆ ถูกต้องหรือไม่
Wizard79

4
@ Lorenzo: ถูกต้อง การสร้างทางเลือกอาจมีความซับซ้อนได้ตามที่คุณต้องการเพียงแค่ให้แน่ใจว่าคุณพบการแลกเปลี่ยนที่ถูกต้องระหว่างความซับซ้อนและความเสี่ยง (อย่าให้ผู้ใช้รอ 5 นาทีในขณะที่คุณตรวจสอบความเป็นไปได้ทั้งหมด
Martijn Pieters

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

2
@WyattBarnett: ไม่มีใครบอกให้ผู้ใช้ทำ ประเด็นสำคัญคือการตรวจจับผู้ใช้และป้องกันไม่ให้ใช้รหัสผ่าน 'เพิ่มขึ้น'
Martijn Pieters

อ๊ะเข้าใจผิดบางอย่างที่นี่ ขอโทษ
ไวแอตต์บาร์เน็ตต์

28

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

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


อย่างนี้เป็นอย่างแน่นอนวิธีแก้ปัญหาที่ฉลาดถ้าคุณไม่ได้มีความต้องการของการทดสอบกับnรหัสผ่านก่อนหน้านี้อย่างไรก็ตามข้อเสนอแนะในการสร้างทางเลือกเพียงแค่ในเวลาที่ดีกว่า แต่การสร้างทางเลือกของรหัสผ่านทั้งสองนั้นดียิ่งขึ้น!
Wizard79

2
@ Lorenzo: ความคิดคือคุณทำการทดสอบโดยตรงกับรหัสผ่านก่อนหน้านี้ n และการทดสอบที่แข็งแกร่งกว่ากับรหัสผ่านล่าสุด มันเป็นการประนีประนอม
Brian

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

7

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

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

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


แต่มีหลายลำดับที่มีระยะทาง Hamming ที่ใหญ่กว่าเช่น February2012 -> March2012 หรือ Fri-09-28-12 -> Tue-11-27-12 (วันที่), Password_Alpha -> Password_Beta, Pass_1111 -> Pass_2222, Pass_qwer, Pass_tyui, ผ่าน, _op [] หรือสิบเอ็ด -> สิบสอง (ระบบการนับทางเลือก) หรือ FrankSmith -> FredJones -> FriarTuck หรือความโกรธ -> สัตว์ -> แอปเปิ้ล (ชื่อในไดเรกทอรี บริษัท หรือคำในพจนานุกรม) ที่ผู้โจมตีด้วย รหัสผ่านก่อนหน้านี้สามารถคาดเดาได้ง่าย แต่อัลกอริทึมของคุณจะมีเวลาในการสร้างที่ยากมาก
Kevin Vermeer

@KevinVermeer พิจารณาบัญชีผู้ที่อยู่ในชุดรูปแบบของคุณและยอมรับว่าคุณจะไม่มีวันได้รับทุกอย่างอีกครั้ง
ratchet freak

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

5

นี่เป็นภาคผนวกของคำตอบที่ฉลาดของ @ Brian ปิดบังยัง @Martijn Pieters สำหรับการเพิ่มรายละเอียดเกี่ยวกับวิธีการเดรัจฉานบังคับใช้รหัสผ่านเก่าโดยอ้างอิงจากรหัสปัจจุบันและ @ratchet freak สำหรับ "ระยะแฮ็ก" ฉันไม่ได้ลบคำตอบของฉันเพราะฉันคิดว่ามันเป็นพื้นหลังที่น่าสนใจในการสำรองข้อมูล

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

ตัวอย่าง

พิจารณาว่ามันง่ายเพียงใดในการใช้รหัสผ่านที่ดุร้ายหากคุณรู้ว่า:

  • ยาว 7 ตัวอักษร
  • อักขระ 3-5 เป็นตัวพิมพ์ใหญ่ (4 ลดลง)
  • 1 และ 7 เป็นตัวเลข
  • 6 เป็นสัญลักษณ์

แป้นพิมพ์สหรัฐอเมริกามี 95 ตัวอักษรที่สามารถพิมพ์ได้ดังนั้นเมื่อรู้ว่ารหัสผ่านยาว 7 ตัวอักษรให้ผลตอบแทน 95 ^ 7 = 69,833,729,610,000 = 7x10 ^ 13 การเรียงสับเปลี่ยน หากเป็นการสุ่มอย่างแท้จริงอาจใช้เวลาหนึ่งปีในการถอดรหัสนี้ในโปรเซสเซอร์ 3Ghz เดียว แต่:

  • มีอักขระตัวพิมพ์ใหญ่เพียง 26 ตัวและตัวพิมพ์เล็ก 26 ตัว
  • มีเพียง 10 หลักเท่านั้นที่ให้ผล 100 โอกาสสำหรับสองตัวเลขนี้
  • มีเพียง 32 สัญลักษณ์

ดังนั้น (แก้ไขให้ถูกต้องด้วย @Hellion):

         26^4 (charcters 2-5 are known upper or lower-case)
        x 100 (characters 1 & 7 are digits)
        x  32 (character 6 is a symbol)
         ====
1,462,323,200 possible passwords.

นั่นง่ายกว่าการแตก 50,000 เท่า! การจัดเก็บข้อมูลที่ดีเพื่อป้องกันรหัสผ่านที่คล้ายกันในกรณีนี้ได้ใช้เวลาในการถอดรหัสรหัสผ่าน 7 ตัวอักษรจากหนึ่งปีเป็นสองชั่วโมง การถอดรหัสรหัสผ่านทั้งหมดของคุณด้วยเดสก์ท็อปแบบมัลติโปรเซสเซอร์อันทรงพลังพร้อมการ์ดแสดงผลที่ดีและความอดทนน้อยก็เป็นไปได้แล้วในตอนนี้ ฉันหวังว่าตัวอย่างง่ายๆนี้แสดงให้เห็นว่ายิ่งคุณสามารถเปรียบเทียบรหัสผ่านที่คล้ายกันได้มากเท่าไหร่ก็ยิ่งมีความปลอดภัยน้อยลงเท่านั้น

ความสำคัญของการแฮ็กที่แข็งแกร่ง

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

ปิดความคิด

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


1
เล็กน้อย nit: ความเป็นไปได้ของรหัสผ่านยังเป็นแบบทวีคูณดังนั้นจึงเป็น (26 ^ 4) * 100 * 32 = 1,462,323,200 หากเราสันนิษฐานว่าการแคร็ก (95 ^ 7) ความเป็นไปได้นั้นใช้เวลาหนึ่งปีการถอดรหัสความเป็นไปได้ที่น้อยลงนี้จะใช้เวลาประมาณ 11 นาที
Hellion

@Hellion - โอ๊ะโอ! ขอบคุณสำหรับการชี้ให้เห็นว่า ฉันแก้ไขมันแล้ว
GlenPeterson

1

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

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

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

  1. เก็บรหัสผ่านแต่ละรายการ (เข้ารหัส) สำหรับรหัสผ่าน "n" ครั้งสุดท้าย
  2. เก็บวันที่และเวลาที่สร้างรหัสผ่านล่าสุด
  3. เก็บแฮชของรหัสผ่านล่าสุด
  4. เข้ารหัสรหัสผ่านทั้งหมดโดยใช้แฮช (ใส่เกลือ) ของรหัสผ่านปัจจุบันและเวลาประทับของการสร้างรหัสผ่านและอาจมีบางอย่างเช่นหมายเลขบัญชีหรือที่อยู่อีเมล
  5. ยกเลิกการเข้ารหัสและเข้ารหัสรหัสผ่านใหม่ทุกครั้งที่มีการสร้างรหัสผ่านใหม่

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

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

นอกจากนี้สำหรับรหัสผ่านเก่าพวกเขาอาจไม่จำเป็นต้องเก็บไว้ในข้อความธรรมดาอย่างเคร่งครัด พวกเขาสามารถเก็บไว้ในบางวิธีที่ทำให้งงงวย หรือเก็บไว้เป็นรายการตามตัวอักษรของตัวอักษรในรหัสผ่าน

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


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