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


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.