คำแนะนำที่ชัดเจนเกี่ยวกับการรับรองความถูกต้องของเว็บไซต์ที่ใช้แบบฟอร์ม [ปิด]


5370

การพิสูจน์ตัวตนแบบฟอร์มสำหรับเว็บไซต์

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

ควรรวมหัวข้อต่างๆเช่น:

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

ไม่ควรมีสิ่งต่าง ๆ เช่น:

  • บทบาทและการอนุญาต
  • การพิสูจน์ตัวตนพื้นฐาน HTTP

โปรดช่วยเราด้วย:

  1. แนะนำหัวข้อย่อย
  2. ส่งบทความที่ดีเกี่ยวกับเรื่องนี้
  3. การแก้ไขคำตอบอย่างเป็นทางการ

52
ทำไมไม่รวมการตรวจสอบสิทธิ์พื้นฐาน HTTP สามารถทำงานในรูปแบบ HTML ผ่าน Ajax: peej.co.uk/articles/http-auth-with-html-forms.html
— ระบบหยุดชั่วคราว

55
HTTP Basic Auth มีคุณสมบัติของการเป็น (ค่อนข้าง) ยากที่จะทำให้เบราว์เซอร์ลืม นอกจากนี้ยังไม่ปลอดภัยอย่างน่ากลัวหากคุณไม่ได้ใช้กับ SSL เพื่อความปลอดภัยในการเชื่อมต่อ (เช่น HTTPS)
— Donal Fellows

24
ฉันคิดว่ามันคุ้มค่าที่จะพูดถึงคุกกี้ (รวมถึงการตรึงและการจี้) คุกกี้ (การรักษาความปลอดภัยและการตั้งค่าสถานะ HTTP เท่านั้น) SSO ที่ใช้ HTTP
— symcbean

29
การHttpOnlyตั้งค่าสถานะคุกกี้ที่มีประโยชน์สุดๆ ซึ่งป้องกันการขโมยคุกกี้ที่ใช้ JavaScript (ชุดย่อยของการโจมตี XSS) ควรถูกกล่าวถึงที่อื่นเช่นกัน
— Alan H.

80
ว้าว. คำตอบที่ยาวมาก upvotes สำหรับบางคน แต่ก็ไม่มีใครพูดถึงข้อผิดพลาดทั่วไปของการให้บริการแบบฟอร์มการเข้าสู่ระบบผ่าน HTTP ฉันได้โต้เถียงกับคนที่พูดว่า "แต่มันส่งไปยัง https: // ... " และจะได้รับการจ้องมองที่ว่างเปล่าเมื่อฉันถามว่าพวกเขาแน่ใจหรือไม่ว่าผู้โจมตีไม่ได้เขียนหน้าเว็บที่ไม่ได้เข้ารหัสไว้ .
— dzuelke

คำตอบ:


3762

ส่วนที่ฉัน: วิธีการเข้าสู่ระบบ

เราจะสมมติว่าคุณทราบวิธีสร้างฟอร์มการเข้าสู่ระบบ + รหัสผ่าน HTML ซึ่งจะโพสต์ค่าไปยังสคริปต์ทางฝั่งเซิร์ฟเวอร์สำหรับการตรวจสอบสิทธิ์ ส่วนด้านล่างจะจัดการกับรูปแบบสำหรับการรับรองความถูกต้องด้านเสียงและวิธีหลีกเลี่ยงข้อผิดพลาดด้านความปลอดภัยที่พบบ่อยที่สุด

เพื่อ HTTPS หรือไม่ไปยัง HTTPS?

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

ในสาระสำคัญเพียงในทางปฏิบัติวิธีการป้องกันการดักฟังโทรศัพท์ / แพ็คเก็ตดมกลิ่นในระหว่างการเข้าสู่ระบบโดยใช้ HTTPS หรือหนังสือรับรองตามรูปแบบการเข้ารหัสอื่น (เช่นTLS ) หรือการพิสูจน์และทดสอบรูปแบบการตอบสนองความท้าทาย (เช่นDiffie-Hellman -Based SRP) วิธีการอื่นใดที่สามารถหลบหลีกได้โดยผู้โจมตีที่ดักฟัง

แน่นอนถ้าคุณยินดีที่จะทำสิ่งเล็กน้อยไม่ได้คุณสามารถใช้รูปแบบการตรวจสอบสิทธิ์แบบสองปัจจัยบางรูปแบบ (เช่นแอป Google Authenticator, สมุดรหัส 'สไตล์สงครามเย็น' ทางกายภาพหรือดองเกิลตัวสร้างคีย์ RSA) หากใช้อย่างถูกต้องสิ่งนี้สามารถทำงานได้แม้จะมีการเชื่อมต่อที่ไม่ปลอดภัย แต่ก็ยากที่จะจินตนาการได้ว่าผู้พัฒนาจะยินดีที่จะใช้การรับรองความถูกต้องสองปัจจัย แต่ไม่ใช่ SSL

(อย่า) การเข้ารหัส / hashing JavaScript ของคุณเอง

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

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

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

CAPTCHAS ต่อมนุษยชาติ

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

รู้ว่าการใช้งานของ CAPTCHA นั้นไม่ได้สร้างเหมือนกัน พวกเขามักจะไม่ใช่มนุษย์ที่สามารถแก้ไขได้จริง ๆ แล้วพวกเขาส่วนใหญ่ไม่ได้ผลกับบอทพวกเขาทั้งหมดไม่ได้ผลกับแรงงานโลกราคาถูก (อ้างอิงจากOWASP , อัตรา sweatshop ปัจจุบันอยู่ที่ $ 12 ต่อการทดสอบ 500 ครั้ง) และการใช้งานบางอย่าง ผิดกฎหมายทางเทคนิคในบางประเทศ (ดูเอกสารรับรองการตรวจสอบสิทธิ์ OWASP ) หากคุณต้องใช้ CAPTCHA ให้ใช้reCAPTCHAของ Google เนื่องจากเป็น OCR-hard ตามคำนิยาม (เนื่องจากใช้การสแกนหนังสือ OCR ที่ไม่ได้จัดประเภทไว้แล้ว) และพยายามอย่างมากที่จะใช้งานง่าย

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

การจัดเก็บรหัสผ่าน / การตรวจสอบการเข้าสู่ระบบ

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

ดังนั้นหากคุณไม่สามารถจัดเก็บรหัสผ่านได้คุณจะตรวจสอบว่าชุดค่าผสมของการลงชื่อเข้าใช้ + รหัสผ่าน POSTed จากแบบฟอร์มเข้าสู่ระบบถูกต้องอย่างไร คำตอบคือ hashing โดยใช้ฟังก์ชั่นที่สำคัญมา เมื่อใดก็ตามที่ผู้ใช้ใหม่ถูกสร้างขึ้นหรือเปลี่ยนรหัสผ่านคุณจะใช้รหัสผ่านและเรียกใช้ผ่าน KDF เช่น Argon2, bcrypt, scrypt หรือ PBKDF2 เปลี่ยนรหัสผ่าน cleartext ("ถูกต้องลงรหัสผ่าน") ซึ่งปลอดภัยมากในการจัดเก็บในฐานข้อมูลของคุณ เพื่อตรวจสอบการเข้าสู่ระบบคุณเรียกใช้ฟังก์ชันแฮชเดียวกันกับรหัสผ่านที่ป้อนเวลานี้ผ่านไปในเกลือและเปรียบเทียบสตริงแฮชผลลัพธ์กับค่าที่เก็บไว้ในฐานข้อมูลของคุณ Argon2, bcrypt และ scrypt เก็บเกลือด้วยแฮชแล้ว ลองดูบทความนี้ใน sec.stackexchange เพื่อดูข้อมูลโดยละเอียดเพิ่มเติม

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

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

ข้อมูลเซสชัน - "คุณเข้าสู่ระบบในฐานะ Spiderman69"

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

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

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

ส่วนที่ II: วิธีการคงการลงชื่อเข้าใช้ - ช่องทำเครื่องหมาย "จดจำฉัน" ที่น่าอับอาย

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

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

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

หากคุณตัดสินใจที่จะใช้คุกกี้เข้าสู่ระบบแบบถาวรนี่คือวิธีที่คุณทำ:

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

  2. และเพียงเพื่อย้ำข้อผิดพลาดที่พบได้บ่อยที่สุดอย่าเก็บ COOKIE เข้าสู่ระบบของคุณไว้ในฐานข้อมูลของคุณเพียงแฮชของมัน! โทเค็นการเข้าสู่ระบบคือรหัสผ่านที่เทียบเท่าดังนั้นหากผู้โจมตีเข้ามาในฐานข้อมูลของคุณพวกเขาสามารถใช้โทเค็นเพื่อเข้าสู่บัญชีใด ๆ ราวกับว่าพวกเขาเป็นชุดรหัสผ่านเข้าสู่ระบบ cleartext ดังนั้นให้ใช้การแฮช (ตามhttps://security.stackexchange.com/a/63438/5002แฮชที่อ่อนแอจะทำได้ดีสำหรับวัตถุประสงค์นี้) เมื่อจัดเก็บโทเค็นการเข้าสู่ระบบแบบถาวร

ตอนที่ III: การใช้คำถามลับ

ไม่ใช้คำถาม 'ความลับ' คุณลักษณะ 'คำถามลับ' คือรูปแบบการรักษาความปลอดภัย อ่านกระดาษจากลิงค์หมายเลข 4 จากรายการต้องอ่าน คุณสามารถถาม Sarah Palin เกี่ยวกับเรื่องนี้หลังจากที่ Yahoo! บัญชีอีเมลถูกแฮ็กในระหว่างการชิงตำแหน่งประธานาธิบดีครั้งก่อนเนื่องจากคำตอบสำหรับคำถามเพื่อความปลอดภัยของเธอคือ ... "Wasilla High School"!

แม้ว่าจะมีคำถามที่ผู้ใช้ระบุ แต่ก็มีโอกาสสูงที่ผู้ใช้ส่วนใหญ่จะเลือก:

  • คำถามลับ 'มาตรฐาน' เช่นชื่อเดิมของแม่หรือสัตว์เลี้ยงตัวโปรด

  • เรื่องไม่สำคัญง่ายๆที่ทุกคนสามารถยกได้จากบล็อกโปรไฟล์ LinkedIn หรือสิ่งที่คล้ายกัน

  • คำถามใด ๆ ที่ตอบได้ง่ายกว่าการเดารหัสผ่าน ซึ่งสำหรับรหัสผ่านที่ดีทุกคำถามที่คุณสามารถจินตนาการได้

โดยสรุปแล้วคำถามด้านความปลอดภัยนั้นไม่ปลอดภัยในทุกรูปแบบและทุกรูปแบบและไม่ควรใช้ในรูปแบบการรับรองความถูกต้องด้วยเหตุผลใดก็ตาม

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

ส่วนที่ 4: ฟังก์ชั่นรหัสผ่านที่ลืม

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

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

  2. แฮชรหัสผ่าน / โทเค็นที่หายไปเสมอในฐานข้อมูล อีกครั้งรหัสนี้เป็นอีกตัวอย่างหนึ่งของรหัสผ่านที่เทียบเท่าดังนั้นจึงต้องมีการแฮชในกรณีที่ผู้โจมตีเข้าสู่ฐานข้อมูลของคุณ เมื่อรหัสรหัสที่หายไปมีการร้องขอส่งรหัส plaintext ไปยังที่อยู่อีเมลของผู้ใช้แล้วสับมันประหยัดกัญชาในฐานข้อมูลของคุณ - และโยนออกไปเดิม เช่นรหัสผ่านหรือโทเค็นการเข้าสู่ระบบแบบถาวร

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

ส่วนที่ V: ตรวจสอบความแข็งแรงของรหัสผ่าน

ก่อนอื่นคุณจะต้องอ่านบทความเล็ก ๆ นี้เพื่อตรวจสอบความจริง: 500 รหัสผ่านที่พบบ่อยที่สุด

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

ดังนั้น: ไม่มีข้อกำหนดด้านความปลอดภัยของรหัสผ่านขั้นต่ำ 2% ของผู้ใช้จึงใช้รหัสผ่านทั่วไป 20 อันดับแรก ความหมาย: หากผู้โจมตีได้เพียง 20 ครั้งบัญชี 1 ใน 50 บัญชีในเว็บไซต์ของคุณจะแตกได้

การขัดขวางสิ่งนี้จำเป็นต้องมีการคำนวณเอนโทรปีของรหัสผ่านจากนั้นจึงใช้เก ​​ณ ฑ์ สถาบันมาตรฐานและเทคโนโลยีแห่งชาติ (NIST) สิ่งพิมพ์พิเศษ 800-63มีชุดของคำแนะนำที่ดีมาก เมื่อรวมกับการวิเคราะห์เค้าโครงพจนานุกรมและแป้นพิมพ์ (ตัวอย่างเช่น 'qwertyuiop' เป็นรหัสผ่านไม่ถูกต้อง) สามารถปฏิเสธรหัสผ่านที่ได้รับการคัดเลือกต่ำทั้งหมด 99%ที่ระดับ 18 บิตของเอนโทรปี เพียงแค่คำนวณความแข็งแรงของรหัสผ่านและการแสดงเครื่องวัดความแรงของภาพให้ผู้ใช้เห็นว่าดี แต่ไม่เพียงพอ ผู้ใช้จำนวนมากมักจะเพิกเฉยต่อมันเว้นแต่จะมีการบังคับใช้

และเพื่อความสดชื่นในการใช้งานรหัสผ่านเอนโทรปีที่เป็นมิตรผู้ใช้ขอแนะนำให้ใช้Password Strength xkcdของ Randall Munroe

ใช้ประโยชน์จาก Troy Hunt ของฉันฉันได้รับ Pwned APIเพื่อตรวจสอบรหัสผ่านของผู้ใช้กับรหัสผ่านที่ถูกบุกรุกในช่องโหว่ข้อมูลสาธารณะ

ตอนที่ VI: อื่น ๆ อีกมากมาย - หรือ: การป้องกันความพยายามในการเข้าสู่ระบบไฟอย่างรวดเร็ว

ก่อนอื่นให้ดูที่ตัวเลข: ความเร็วในการกู้รหัสผ่าน - รหัสผ่านของคุณจะตั้งอยู่นานเท่าไร

หากคุณไม่มีเวลาสำรวจตารางในลิงค์ดังกล่าวนี่คือรายการของพวกเขา:

  1. มันต้องใช้เวลาแทบไม่มีเวลาที่จะแตกรหัสผ่านที่อ่อนแอแม้ว่าคุณจะแตกมันด้วยลูกคิด

  2. มันต้องใช้เวลาแทบไม่มีเวลาที่จะแตกตัวเลขและรหัสผ่าน 9 ตัวถ้ามันเป็นกรณีตาย

  3. มันต้องใช้เวลาแทบไม่มีเวลาที่จะแตกซับซ้อนสัญลักษณ์และตัวอักษรและตัวเลขรหัสผ่านบนและตัวพิมพ์เล็กถ้ามันเป็นน้อยกว่า 8 ตัวอักษร (พีซีสามารถค้นหา Keyspace ทั้งหมดถึง 7 ตัวละครในเรื่อง วันหรือชั่วโมง)

  4. อย่างไรก็ตามจะใช้เวลานานเกินไปในการถอดรหัสแม้แต่รหัสผ่าน 6 ตัวอักษรหากคุณ จำกัด การพยายามหนึ่งครั้งต่อวินาที!

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

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

  • นำเสนอCAPTCHAหลังจากความพยายามที่ล้มเหลว N ครั้ง (น่ารำคาญเหมือนนรกและบ่อยครั้งที่ไม่ได้ผล - แต่ฉันกำลังทำซ้ำตัวเองที่นี่

  • การล็อคบัญชีและต้องการการยืนยันอีเมลหลังจากความพยายามที่ล้มเหลว N ครั้ง (นี่คือการโจมตี DoS ที่รอให้เกิดขึ้น)

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

วิธีปฏิบัติที่ดีที่สุด # 1:การหน่วงเวลาสั้น ๆ ที่เพิ่มขึ้นตามจำนวนความพยายามที่ล้มเหลวเช่น:

  • 1 ความพยายามที่ล้มเหลว = ไม่ล่าช้า
  • 2 ความพยายามล้มเหลว = 2 วินาทีล่าช้า
  • 3 ครั้งที่ล้มเหลว = 4 วินาทีล่าช้า
  • 4 ครั้งที่ล้มเหลว = 8 วินาทีล่าช้า
  • 5 ความพยายามที่ล้มเหลว = ความล่าช้า 16 วินาที
  • เป็นต้น

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

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

วิธีปฏิบัติที่ดีที่สุด # 2:การหน่วงเวลาความยาวขนาดกลางที่จะมีผลบังคับใช้หลังจากความพยายามที่ล้มเหลว N ครั้งเช่น:

  • ความพยายามล้มเหลว 1-4 ครั้ง = ไม่ล่าช้า
  • 5 ครั้งที่ล้มเหลว = 15-30 นาทีล่าช้า

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

แนวปฏิบัติที่ดีที่สุด # 3:การรวมสองวิธีเข้าด้วยกัน - อาจเป็นการหน่วงเวลาแบบสั้นและคงที่ซึ่งจะมีผลบังคับใช้หลังจากความพยายามที่ล้มเหลว N ครั้งเช่น:

  • ความพยายามล้มเหลว 1-4 ครั้ง = ไม่ล่าช้า
  • 5+ ครั้งที่ล้มเหลว = 20 วินาทีล่าช้า

หรือความล่าช้าที่เพิ่มขึ้นโดยมีขอบเขตคงที่เช่น:

  • 1 ความพยายามล้มเหลว = 5 วินาทีล่าช้า
  • 2 ความพยายามล้มเหลว = 15 วินาทีล่าช้า
  • 3+ ความพยายามล้มเหลว = 45 วินาทีล่าช้า

รูปแบบสุดท้ายนี้นำมาจากคำแนะนำการปฏิบัติที่ดีที่สุดของ OWASP (ลิงก์ 1 จากรายการต้องอ่าน) และควรได้รับการพิจารณาว่าเป็นแนวปฏิบัติที่ดีที่สุดแม้ว่าจะได้รับการยอมรับในด้านที่ จำกัด

อย่างไรก็ตามตามหลักการทั่วไปแล้วผมจะบอกว่ายิ่งนโยบายรหัสผ่านของคุณแข็งแกร่งมากเท่าไหร่คุณก็ยิ่งมีข้อผิดพลาดน้อยลงเท่านั้น หากคุณต้องการรหัสผ่านที่รัดกุม (ตัวอักษรและตัวเลขและตัวเลขและสัญลักษณ์ที่ต้องการ) 9+ ตัวอักษรคุณสามารถให้ผู้ใช้ 2-4 ครั้งโดยไม่ล่าช้ารหัสผ่านก่อนที่จะเปิดใช้งานการควบคุมปริมาณ

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

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

ตอนที่ 7: การโจมตีแบบ Brute Force แบบกระจาย

ผู้โจมตีขั้นสูงกว่าจะพยายามหลีกเลี่ยงการควบคุมปริมาณการเข้าสู่ระบบด้วยการ 'กระจายกิจกรรม':

  • การกระจายความพยายามใน botnet เพื่อป้องกันการตั้งค่าที่อยู่ IP

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

  • เว้นวรรคคำขอเข้าสู่ระบบสำหรับบัญชีผู้ใช้แต่ละบัญชีพูดกัน 30 วินาทีเพื่อแอบดูภายใต้เรดาร์

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

นามธรรมเกินไป? ให้ฉันใช้ถ้อยคำใหม่:

สมมติว่าไซต์ของคุณมีการเข้าสู่ระบบที่ไม่ดีเฉลี่ย 120 ครั้งต่อวันในช่วง 3 เดือนที่ผ่านมา เมื่อใช้ (โดยเฉลี่ย) ระบบของคุณอาจตั้งค่าขีด จำกัด ส่วนกลางเป็น 3 เท่านั่นคือ ความพยายามล้มเหลว 360 ครั้งในระยะเวลา 24 ชั่วโมง จากนั้นหากจำนวนความพยายามทั้งหมดที่ล้มเหลวในทุกบัญชีเกินจำนวนนั้นภายในหนึ่งวัน (หรือดีกว่านั้นให้ตรวจสอบอัตราการเร่งความเร็วและทริกเกอร์ตามเกณฑ์ที่คำนวณ) มันจะเปิดใช้การควบคุมปริมาณการเข้าสู่ระบบทั่วทั้งระบบ (ยังมีข้อยกเว้นของการเข้าสู่ระบบคุกกี้และ / หรือการเข้าสู่ระบบ CAPTCHA สำรอง)

ฉันยังโพสต์คำถามพร้อมรายละเอียดเพิ่มเติมและการสนทนาที่ดีมากเกี่ยวกับวิธีหลีกเลี่ยง pitfals หากินเพื่อป้องกันการโจมตีแบบเดรัจฉานแบบกระจาย

ส่วนที่ 8: การรับรองความถูกต้องแบบสองปัจจัยและผู้ให้บริการการตรวจสอบความถูกต้อง

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

การพิสูจน์ตัวตนสามารถมอบสิทธิ์ให้กับบริการ single sign-on ได้อย่างสมบูรณ์ซึ่งผู้ให้บริการรายอื่นจัดการรวบรวมข้อมูลประจำตัว สิ่งนี้จะผลักดันปัญหาไปยังบุคคลที่สามที่เชื่อถือได้ ทั้ง Google และ Twitter ให้บริการมาตรฐาน SSO ในขณะที่ Facebook ให้บริการโซลูชันที่คล้ายคลึงกัน

ต้องอ่านลิงก์เกี่ยวกับการตรวจสอบสิทธิ์ของเว็บ

  1. คู่มือ OWASP ในการรับรองความถูกต้อง / OWASP สูตรการตรวจสอบสิทธิ์
  2. Dos และ Don'ts ของการรับรองความถูกต้องของลูกค้าบนเว็บ (รายงานการวิจัย MIT ที่อ่านง่ายมาก)
  3. Wikipedia: คุกกี้ HTTP
  4. คำถามความรู้ส่วนบุคคลสำหรับการรับรองความถูกต้องสำรอง: คำถามเพื่อความปลอดภัยในยุคของ Facebook (บทความวิจัยของ Berkeley ที่อ่านง่ายมาก)

67
ฉันไม่เห็นด้วยกับส่วนแคปต์ช่าใช่แคปต์ชาเป็นที่น่ารำคาญและพวกเขาก็สามารถแตกได้ (ยกเว้น recaptcha แต่นี่แทบจะไม่สามารถแก้ไขได้โดยมนุษย์!) แต่นี่ก็เหมือนกับว่าไม่ใช้ตัวกรองสแปมเพราะมันมี น้อยกว่าเท็จเชิงลบ 0.1% .. เว็บไซต์นี้มากใช้ Captchas พวกเขาจะไม่สมบูรณ์แบบ แต่พวกเขาตัดเป็นจำนวนมากของสแปมและมีทางเลือกเพียงแค่ไม่ดีกับพวกเขา
— Waleed Eissa

235
@Jeff: ฉันขอโทษที่ได้ยินว่าคุณมีปัญหากับคำตอบของฉัน ฉันไม่รู้ว่ามีการถกเถียงกันเรื่อง Meta เกี่ยวกับคำตอบนี้ฉันจะแก้ไขเองด้วยความยินดีหากคุณต้องการให้ฉัน และการลบโพสต์ของฉันเพิ่งลบ 1200 ชื่อเสียงออกจากบัญชีของฉันซึ่งเจ็บ :(
— Jens Roland

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

12
"พีซีแบบเดสก์ท็อปสามารถค้นหา FULL KEYSPACE ได้สูงสุด 7 ตัวอักษรในเวลาน้อยกว่า 90 วัน" เครื่องที่มี GPU ล่าสุดสามารถค้นหา 7 key char แบบเต็มในเวลาน้อยกว่า 1 วัน GPU แถวหน้าสามารถจัดการแฮช 1 พันล้านต่อวินาที golubev.com/hashgpu.htm สิ่งนี้นำไปสู่ข้อสรุปบางประการเกี่ยวกับการจัดเก็บรหัสผ่านซึ่งไม่ได้รับการแก้ไขโดยตรง
— Frank Farmer

9
ฉันประหลาดใจที่ไม่ได้รับการกล่าวถึงการปกป้อง CSRF ...
— Flukey

418

บทความที่ชัดเจน

กำลังส่งข้อมูลรับรอง

วิธีเดียวที่การปฏิบัติเพื่อให้ข้อมูลประจำตัวส่ง 100% ปลอดภัยโดยใช้SSL การใช้ JavaScript เพื่อแฮรหัสผ่านไม่ปลอดภัย ข้อผิดพลาดทั่วไปสำหรับการแฮชรหัสผ่านฝั่งไคลเอ็นต์:

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

มีวิธีการที่ปลอดภัยอื่นที่เรียกว่าเป็นSRPแต่ก็จดสิทธิบัตร (แม้ว่าจะได้รับใบอนุญาตได้อย่างอิสระ ) และมีการใช้งานที่ดีไม่กี่ใช้ได้

กำลังจัดเก็บรหัสผ่าน

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

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

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

คำถามเพื่อความปลอดภัย

คำถามเพื่อความปลอดภัยไม่ปลอดภัย - หลีกเลี่ยงการใช้ ทำไม? ทุกคำถามที่มีความปลอดภัยรหัสผ่านทำได้ดีกว่า อ่านตอนที่3: การใช้คำถามลับใน@Jens Roland ตอบที่นี่ในวิกินี้

คุกกี้เซสชัน

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

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

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

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

รายการทรัพยากรภายนอก


1
เมื่อพิจารณาถึงช่องโหว่ของ MITM เมื่อเร็ว ๆ นี้โดยรอบใบรับรอง SSL ที่ได้รับการเซ็นชื่อ ( blog.startcom.org/?p=145 ) ดังนั้นการรวมกันของ SSL กับการรับรองความถูกต้องการตอบสนองต่อความท้าทาย (มีทางเลือกแทน SRP) น่าจะเป็นทางออกที่ดีกว่า
— เควิน Loney

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

แพคเกจ BCrypt Nuget: nuget.org/List/Packages/BCrypt
— Fabian Vilers

1
หมายเหตุ 1 เกี่ยวกับคำตอบนี้มันเป็นฉบับร่างที่จะแก้ไขเป็นวิกิ หากคุณสามารถแก้ไขสิ่งนี้ได้ยินดีต้อนรับ
— Peter Mortensen

SRP นั้นมีความเฉพาะเจาะจงต่อการปรากฏตัวของหลาย ๆ ฝ่ายถ้าฉันเข้าใจดี
— Webwoman

162

ประการแรกข้อแม้ที่แข็งแกร่งที่คำตอบนี้ไม่เหมาะที่สุดสำหรับคำถามที่แน่นอนนี้ ไม่ควรเป็นคำตอบที่แน่นอน!

ฉันจะไปข้างหน้าและพูดถึงBrowserIDของ Mozilla ที่เสนอ(หรืออาจมากกว่านั้นอย่างแม่นยำ, โปรโตคอลอีเมลที่ได้รับการยืนยัน ) ในจิตวิญญาณของการค้นหาเส้นทางการอัพเกรดเพื่อแนวทางที่ดีกว่าในการรับรองความถูกต้องในอนาคต

ฉันจะสรุปแบบนี้:

  1. Mozilla เป็นองค์กรไม่แสวงหากำไรที่มีค่านิยมสอดคล้องกับการค้นหาวิธีแก้ไขปัญหาที่ดี
  2. ความจริงวันนี้คือเว็บไซต์ส่วนใหญ่ใช้การรับรองความถูกต้องแบบฟอร์ม
  3. การตรวจสอบแบบฟอร์มที่ใช้มีอุปสรรคใหญ่ซึ่งเป็นความเสี่ยงที่เพิ่มขึ้นของฟิชชิ่ง ผู้ใช้จะถูกขอให้ป้อนข้อมูลที่ละเอียดอ่อนลงในพื้นที่ที่ควบคุมโดยเอนทิตีระยะไกลแทนที่จะเป็นพื้นที่ที่ควบคุมโดยตัวแทนผู้ใช้ (เบราว์เซอร์)
  4. เนื่องจากเบราว์เซอร์มีความน่าเชื่อถือโดยปริยาย (แนวคิดทั้งหมดของตัวแทนผู้ใช้คือการดำเนินการในนามของผู้ใช้) พวกเขาสามารถช่วยปรับปรุงสถานการณ์นี้
  5. ความคืบหน้าหลังแรงหลักถือที่นี่คือการหยุดชะงักการใช้งาน การแก้ปัญหาจะต้องแบ่งออกเป็นขั้นตอนที่ให้ผลประโยชน์ที่เพิ่มขึ้นด้วยตัวเอง
  6. วิธีการกระจายอำนาจที่ง่ายที่สุดสำหรับการแสดงตัวตนที่สร้างไว้ในโครงสร้างพื้นฐานอินเทอร์เน็ตคือชื่อโดเมน
  7. ในฐานะที่เป็นระดับที่สองของการแสดงตัวตนแต่ละโดเมนจัดการบัญชีชุดของตัวเอง
  8. แบบฟอร์ม“ @โดเมนบัญชี” นั้นรัดกุมและสนับสนุนโดยโปรโตคอลและ URI ที่หลากหลาย แน่นอนว่าตัวระบุดังกล่าวนั้นได้รับการยอมรับในระดับสากลว่าเป็นที่อยู่อีเมล
  9. ผู้ให้บริการอีเมลนั้นเป็นผู้ให้บริการข้อมูลประจำตัวหลักทางออนไลน์อยู่แล้ว กระแสรีเซ็ตรหัสผ่านปัจจุบันมักจะให้คุณสามารถควบคุมบัญชีได้หากคุณสามารถพิสูจน์ได้ว่าคุณควบคุมที่อยู่อีเมลที่เกี่ยวข้องของบัญชีนั้น
  10. โปรโตคอลอีเมลที่ตรวจสอบแล้วได้รับการเสนอเพื่อให้วิธีการรักษาความปลอดภัยโดยใช้การเข้ารหัสแบบพับลิกคีย์เพื่อการปรับปรุงกระบวนการพิสูจน์โดเมน B ที่คุณมีบัญชีอยู่ในโดเมน A
  11. สำหรับเบราว์เซอร์ที่ไม่สนับสนุนโปรโตคอลอีเมลที่ตรวจสอบแล้ว (ปัจจุบันทั้งหมด) Mozilla ให้บริการ shim ซึ่งใช้โปรโตคอลในโค้ด JavaScript ฝั่งไคลเอ็นต์
  12. สำหรับบริการอีเมลที่ไม่สนับสนุนโปรโตคอลอีเมลที่ตรวจสอบแล้วโปรโตคอลอนุญาตให้บุคคลที่สามทำหน้าที่เป็นคนกลางที่เชื่อถือได้โดยยืนยันว่าพวกเขาได้ยืนยันความเป็นเจ้าของบัญชีของผู้ใช้แล้ว ไม่เป็นที่พึงปรารถนาที่จะมีบุคคลที่สามเป็นจำนวนมาก ความสามารถนี้มีจุดประสงค์เพื่ออนุญาตเส้นทางการอัปเกรดเท่านั้นและเป็นที่ต้องการมากว่าบริการอีเมลจะให้การยืนยันเหล่านี้ด้วยตนเอง
  13. Mozilla เสนอบริการของตนเองเพื่อทำหน้าที่เหมือนบุคคลที่สามที่น่าเชื่อถือ ผู้ให้บริการ (กล่าวคือฝ่ายที่ใช้งาน) ใช้โพรโทคอลอีเมลที่ได้รับการยืนยันแล้วอาจเลือกที่จะเชื่อถือการยืนยันของ Mozilla หรือไม่ บริการของ Mozilla จะตรวจสอบความเป็นเจ้าของบัญชีของผู้ใช้โดยใช้วิธีการทั่วไปในการส่งอีเมลพร้อมลิงก์ยืนยัน
  14. แน่นอนผู้ให้บริการอาจเสนอโปรโตคอลนี้เป็นตัวเลือกนอกเหนือจากวิธีการตรวจสอบอื่น ๆ ที่พวกเขาอาจต้องการเสนอ
  15. ประโยชน์ของอินเทอร์เฟซผู้ใช้ขนาดใหญ่ที่กำลังค้นหาอยู่ที่นี่คือ“ ตัวเลือกเอกลักษณ์” เมื่อผู้ใช้เยี่ยมชมเว็บไซต์และเลือกที่จะรับรองความถูกต้องเบราว์เซอร์ของพวกเขาจะแสดงที่อยู่อีเมลที่เลือก (“ ส่วนบุคคล”,“ งาน”,“ กิจกรรมทางการเมือง” ฯลฯ ) พวกเขาอาจใช้เพื่อระบุตัวตนของเว็บไซต์
  16. ส่วนติดต่อผู้ใช้ขนาดใหญ่ที่ได้รับการแสวงหาซึ่งเป็นส่วนหนึ่งของความพยายามนี้คือการช่วยให้เบราว์เซอร์ทราบข้อมูลเพิ่มเติมเกี่ยวกับเซสชันของผู้ใช้ - ผู้ที่พวกเขาลงชื่อเข้าใช้ในปัจจุบันเป็นหลัก - ดังนั้นจึงอาจแสดงได้ว่า
  17. เนื่องจากลักษณะการกระจายของระบบนี้จึงหลีกเลี่ยงการล็อคอินกับเว็บไซต์ที่สำคัญ ๆ เช่น Facebook, Twitter, Google และอื่น ๆ บุคคลใดก็ตามสามารถเป็นเจ้าของโดเมนของตัวเองและดังนั้นจึงทำหน้าที่เป็นผู้ให้บริการข้อมูลส่วนตัวของตนเอง

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


3
การเชื่อมโยงของ BrowserID นั้นตายแล้ว
— Mehdi Bounya

ดูเหมือนว่าโครงการจะถูก mothballed .... ดูen.wikipedia.org/wiki/Mozilla_Persona
— Jeff Olson

138

ฉันแค่คิดว่าฉันจะแบ่งปันโซลูชันนี้ที่ฉันพบว่าทำงานได้ดี

ฉันเรียกมันว่าDummy Field (แม้ว่าฉันจะไม่ได้ประดิษฐ์สิ่งนี้ดังนั้นอย่าให้เครดิตฉัน)

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

<input type="text" name="email" style="display:none" />

เคล็ดลับคือการหลอกบอทให้คิดว่ามันมีการแทรกข้อมูลลงในช่องที่ต้องการนั่นคือเหตุผลที่ฉันตั้งชื่ออินพุต "อีเมล" หากคุณมีเขตข้อมูลที่เรียกว่าอีเมลที่คุณใช้อยู่คุณควรลองตั้งชื่อเขตข้อมูลจำลองอย่างอื่นเช่น "บริษัท ", "โทรศัพท์" หรือ "ที่อยู่อีเมล" เพียงแค่เลือกสิ่งที่คุณรู้ว่าคุณไม่ต้องการและสิ่งที่ดูเหมือนว่าคนทั่วไปจะพบเหตุผลที่จะกรอกลงในแบบฟอร์มบนเว็บ ตอนนี้ซ่อนinputเขตข้อมูลโดยใช้ CSS หรือ JavaScript / jQuery - สิ่งที่เหมาะกับคุณที่สุด - อย่าเพิ่งตั้งค่าอินพุตtypeให้hiddenไม่เช่นนั้นบ็อตจะไม่ตกหล่น

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

ตัวอย่าง:

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

ในกรณีของบ็อต:บ็อตจะเห็นฟิลด์ที่มีประเภทtextและชื่อemail(หรืออะไรก็ตามที่คุณเรียกมัน) และจะพยายามป้อนข้อมูลที่เหมาะสมตามหลักเหตุผล ไม่สนใจว่าคุณกำหนดสไตล์ของอินพุตด้วย CSS แฟนซีหรือไม่นักพัฒนาเว็บก็ทำตลอดเวลา ไม่ว่ามูลค่าในฟิลด์ดัมมี่คืออะไรเราไม่สนใจตราบใดที่มันมีขนาดใหญ่กว่า0ตัวอักษร

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

ฉันเชื่อว่านี่สามารถใช้งานได้ดีกับแบบฟอร์มล็อกอิน / การตรวจสอบสิทธิ์

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

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

มีความคิดสร้างสรรค์!


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

8
ฉันยังมีอีกหลายอย่างที่ใช้เหล่านี้visibility:hiddenและposition:absolute;top:-9000pxคุณยังสามารถทำได้text-indentและz-indexในองค์ประกอบเหล่านี้บางส่วนและวางไว้ในชื่อไฟล์ CSS ที่ถูกบีบอัดด้วยชื่อที่น่าอึดอัดใจ - เนื่องจากบอทสามารถตรวจจับได้ 1display: none` และตอนนี้ ชุดค่าผสม - จริง ๆ แล้วฉันใช้วิธีการเหล่านี้และพวกเขากำลังเทคนิคเก่าของการค้าขาย +1
— TheBlackBenzKid

18
จะเกิดอะไรขึ้นเมื่อผู้ใช้ที่มีความบกพร่องทางการมองเห็นกำลังใช้โปรแกรมอ่านหน้าจอเพื่อนำทางแบบฟอร์ม
— soycharliente

8
เทคนิคนี้มีชื่อ: the honeypot en.wikipedia.org/wiki/Honeypot_(computing)
— pixeline

27
ไม่จำเป็นต้องใส่สไตล์แบบอินไลน์ เพียงเพิ่มคลาสลงในฟิลด์ (อาจใช้คำแปลก ๆ ที่ไม่สามารถแปลความหมายอะไรกับบอท) และซ่อนมันผ่านไฟล์ CSS ของเว็บไซต์ กดไลค์<input type="text" name="email" class="cucaracha">และใน CSS: .cucaracha { display:none; }
— Ricardo Zea

81

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

การแก้ไข / คำตอบที่แนะนำของฉันคือ

  • ปัญหาอยู่ที่การตั้งค่าบัญชีมากกว่าการตรวจสอบรหัสผ่าน
  • การใช้การรับรองความถูกต้องด้วยสองปัจจัยนั้นมีความปลอดภัยมากกว่าการเข้ารหัสรหัสผ่านที่ชาญฉลาดกว่า
  • อย่าพยายามใช้รูปแบบการเข้าสู่ระบบของคุณเองหรือการจัดเก็บฐานข้อมูลรหัสผ่านเว้นแต่ว่าข้อมูลที่จัดเก็บนั้นไม่มีค่าเมื่อสร้างบัญชีและสร้างขึ้นเอง (นั่นคือรูปแบบเว็บ 2.0 เช่น Facebook, Flickrเป็นต้น)

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

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

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

ดังนั้น ...

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

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

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

  1. Kerberos และ SPNEGO - กลไกการลงชื่อเพียงครั้งเดียวกับบุคคลที่สามที่เชื่อถือได้ - โดยทั่วไปผู้ใช้จะตรวจสอบกับบุคคลที่สามที่เชื่อถือได้ (หมายเหตุนี่ไม่ใช่วิธีที่ไม่น่าเชื่อถือOAuth แต่อย่างใด )

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

  3. ฝั่งไคลเอ็นต์SSL - มอบใบรับรองกุญแจสาธารณะให้กับลูกค้า (สนับสนุนในเบราว์เซอร์หลักทั้งหมด - แต่ตั้งคำถามเกี่ยวกับความปลอดภัยของเครื่องไคลเอ็นต์)

ในท้ายที่สุดมันคือการแลกเปลี่ยนสิ่งที่เป็นค่าใช้จ่ายของการละเมิดความปลอดภัยเทียบกับค่าใช้จ่ายของการใช้วิธีการที่ปลอดภัยมากขึ้น อยู่มาวันหนึ่งเราอาจเห็นPKIที่เหมาะสมได้รับการยอมรับอย่างกว้างขวางและไม่มีแบบฟอร์มการตรวจสอบสิทธิ์ย้อนกลับและฐานข้อมูล วันหนึ่ง...


29
ยากที่จะบอกว่าคำตอบใดที่คุณกำลังพูดถึงใน 'ฉันไม่คิดว่าคำตอบข้างต้นคือ "ผิด"'
— Davorak

55

เมื่อแฮ็ชอย่าใช้อัลกอริธึมการแฮ็กอย่างรวดเร็วเช่น MD5 (มีการใช้งานฮาร์ดแวร์จำนวนมาก) ใช้บางอย่างเช่น SHA-512 สำหรับรหัสผ่านแฮชที่ช้าลงจะดีกว่า

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


5
SHA-512 นั้นรวดเร็วเช่นกันดังนั้นคุณต้องมีการวนซ้ำนับพัน
— Seun Osewa

5
"อย่าใช้อัลกอริธึมการแฮ็กเร็ว ... แฮชช้ากว่าดีกว่า" - คำอธิบาย? เอกสาร?
— one.beat.consumer

17
คำอธิบาย: ยิ่งคุณสร้างแฮชเร็วขึ้นเท่าใดตัวตรวจสอบแรงเดรัจฉานก็สามารถทำงานได้เร็วขึ้น แฮชที่ช้าลงจะทำให้การบังคับเดรัจฉานช้าลง อัลกอริทึมแฮชแบบช้าจะทำให้การเดรัจฉานบังคับไม่ได้สำหรับรหัสผ่านที่ยาวขึ้น (8 หลัก +)
— NickG

6
มากกว่าเช่น bcrypt ซึ่งถูกออกแบบมาเพื่อแฮชอย่างช้าๆ
— Fabian Nicollier

4
ดังที่กล่าวไว้ในคำตอบอื่น "OWASP แนะนำให้ใช้ Argon2 เป็นตัวเลือกแรกของคุณสำหรับแอปพลิเคชันใหม่หากไม่พร้อมใช้งานควรใช้ PBKDF2 หรือ scrypt แทนและสุดท้ายถ้าไม่มีสิ่งใดข้างต้นให้ใช้ bcrypt" ไม่ควรใช้ MD5 หรือฟังก์ชันการแฮ็ก SHA ใด ๆ สำหรับรหัสผ่านการแฮช คำตอบนี้เป็นคำแนะนำที่ไม่ดี
— Mike


51

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


25

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


ลิงก์แบบง่ายในอีเมลไม่ปลอดภัยจริง ๆ เนื่องจากอีเมลไม่ปลอดภัย
— David Spector

มีความปลอดภัยเท่ากับระบบการรีเซ็ตรหัสผ่านโทเค็นอื่น ๆ ที่ไม่ได้เป็นสองปัจจัย ซึ่งเกือบทั้งหมดนั้น
— เลนดันแคน

17

ฉันไม่รู้ว่าการตอบคำถามนี้เป็นคำตอบที่ดีที่สุดหรือไม่ ฉันเลือกใช้ตัวเลือกแรก

เกี่ยวกับ poing ส่วนที่ IV: ฟังก์ชั่นรหัสผ่านที่ลืมในคำตอบแรกฉันจะทำให้จุดเกี่ยวกับการโจมตีเวลา

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

เกี่ยวกับแบบฟอร์มลืมรหัสผ่านฉันจะเพิ่มว่ามันเป็นความคิดที่ดีที่จะเท่ากันระหว่างแบบสอบถามที่ประสบความสำเร็จและไม่สมควรกับฟังก์ชั่นความล่าช้าบางอย่าง

https://crypto.stanford.edu/~dabo/papers/webtiming.pdf


14

ฉันต้องการเพิ่มความคิดเห็นที่สำคัญอย่างหนึ่ง: -

  • “ ในการตั้งค่าภายในองค์กร ” ส่วนใหญ่หากไม่ใช่สิ่งที่กล่าวมาทั้งหมดอาจใช้ไม่ได้!

บริษัท หลายแห่งปรับใช้เว็บไซต์ "ใช้งานภายในเท่านั้น" ซึ่งเป็น "แอปพลิเคชันขององค์กร" ที่มีประสิทธิภาพซึ่งถูกนำไปใช้ผ่าน URL URL เหล่านี้สามารถ(สมมุติ ... )เท่านั้นที่สามารถแก้ไขได้ภายใน "เครือข่ายภายในของ บริษัท ฯ ." (เครือข่ายใดรวมถึง 'road warriors' ที่เชื่อมต่อด้วย VPN อย่างน่าอัศจรรย์)

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

บริการ "การรับรองความถูกต้อง + การอนุญาต" นี้สามารถให้บริการโดยเทคโนโลยีที่แตกต่างกันเช่น LDAP (Microsoft OpenDirectory)หรือ Kerberos

จากมุมมองของคุณคุณก็รู้สิ่งนี้: ทุกคนที่ถูกลมพัดมาที่เว็บไซต์ของคุณจะต้องมาพร้อมกับ [ตัวแปรสภาพแวดล้อมที่มีเวทมนต์ที่มี ... ] "โทเค็น" ( เช่นการไม่มีโทเค็นดังกล่าวจะต้องเป็นพื้นที่ทันทีสำหรับ404 Not Found)

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

เอ่อ ... มันค่อนข้างจะเปลี่ยนใจจาก "อินเทอร์เน็ตที่บ้าคลั่ง"


9
คุณตกอยู่ในเครื่องหมายวรรคตอนเช่นเดียวกับเด็กหรือไม่? :) ฉันอ่านมันสามครั้งแล้วและฉันก็ยังแพ้ในจุดที่คุณพยายามทำ แต่ถ้าคุณกำลังพูดว่า "บางครั้งคุณไม่จำเป็นต้องใช้การพิสูจน์ตัวตนแบบฟอร์ม" ก็แสดงว่าคุณถูกต้อง แต่เมื่อพิจารณาว่าเรากำลังคุยกันเมื่อเราต้องการฉันไม่เห็นว่าทำไมสิ่งนี้สำคัญมากที่ควรทราบ
— Hugo Delsing

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

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

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