คุณต้องการที่จะทิ้งค่าอินเทอร์เน็ตราคาแพงของคุณและใช้ wifi ที่ไม่ปลอดภัยของเพื่อนบ้านของคุณหรือไม่? สิ่งเดียวที่รั้งคุณไว้สำหรับขั้นตอนการตรวจสอบสิทธิ์ Single-factor ของ Honeybadger หรือไม่? ฉันมีข่าวมาบอกเธอไหม
ประกาศ:การตรวจสอบสิทธิ์แบบสองปัจจัย (2FA)
พูดเล่นๆ เราให้ความสำคัญกับความปลอดภัยเป็นอย่างมาก เรารู้สึกตื่นเต้นที่ได้มอบเครื่องมือสำคัญที่ช่วยให้ผู้ใช้และข้อมูลของพวกเขาปลอดภัยยิ่งขึ้น
ฉันคิดว่าฉันสามารถอธิบายวิธีเปิดใช้งาน 2FA ได้ แต่ความสนุกในนั้นคืออะไร ลองมาดูโลกแห่งการเข้ารหัสและค้นหาว่า 2FA ทำงานอย่างไร
ถ้าไม่ใช่เรื่องสนุก คุณสามารถไปที่ How to enable ได้เลย ความรู้สึกของฉันจะไม่ถูกทำร้าย
⚠️ คำเตือน:ทฤษฎีบางส่วนด้านล่าง
การใช้งาน 2FA จำนวนมากสร้างขึ้นจากอัลกอริทึมที่เรียกว่า รหัสผ่านแบบใช้ครั้งเดียวตามเวลา (TOTP ). กลิ้งออกจากลิ้นได้เลย
ครั้งเดียว?
ใช่ ความสวยงามของวิธีนี้คือการที่คุณไม่ได้ส่ง "รหัสผ่าน" เดียวกันทุกครั้งที่คุณเข้าสู่ระบบ การใช้แอปพลิเคชันตรวจสอบความถูกต้อง "รหัสผ่าน" แบบใช้ครั้งเดียวจะถูกสร้างขึ้นและยังคงใช้ได้ในช่วงเวลาสั้นๆ (ปกติคือ 30 วินาที) ซึ่งลดประสิทธิภาพของการโจมตีแบบ malcolm-in-the-middle ลงอย่างมาก
แม้ว่าจะมีบิตที่ซับซ้อนอยู่บ้าง แต่การใช้งานโดยรวมก็ค่อนข้างง่าย
ความลับ
กุญแจ ชี้ให้เข้าใจเกี่ยวกับ TOTP คือเซิร์ฟเวอร์ (ผู้ตรวจสอบ) และผู้ตรวจสอบสิทธิ์ (ผู้พิสูจน์) ต้องมีความลับร่วมกัน นี่คือ ของจริง "รหัสผ่าน" แต่ถูกส่งเพียงครั้งเดียว (ฉันเดาว่านี่เป็นครั้งเดียวเช่นกัน)!
วิธีแนะนำในการใช้ความลับคือการใช้รหัส QR เมื่อคุณสแกนรหัส QR ลงในสมาร์ทโฟน ความลับจะถูกเข้ารหัสภายใน URI มาตรฐานที่มีลักษณะดังนี้:
otpauth://totp/Honeybadger.io:[email protected]?secret=base32-secret-key
การให้รหัส QR มีประโยชน์เล็กน้อย (แทนที่จะเปิดเผยความลับของข้อความธรรมดา):
- ใครมีเวลาพิมพ์รหัสอักขระ 32 ตัว
- แอปตรวจสอบความถูกต้องของคุณสามารถให้ป้ายกำกับที่เป็นประโยชน์สำหรับรหัสผ่านแบบใช้ครั้งเดียวของคุณได้ (อ้างอิงอีเมลและผู้ออกใน URI) สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณใช้ 2FA กับหลายบริการ
- ในที่สุดก็ ดี เหตุผลที่ต้องใช้รหัส QR!
มีพารามิเตอร์เพิ่มเติมบางส่วน (ส่วนใหญ่ละเว้น) สำหรับ otpauth
แบบแผน ซึ่งคุณสามารถดูได้ที่นี่
MAC กับฉัน
เมื่อความลับได้รับการตกลงกับ 🤝 คุณจะถูกถาม (ในบางจุด) ให้ระบุรหัสผ่านแบบใช้ครั้งเดียว นี่คือสิ่งที่กลายเป็นจริง .
TOTP สร้างขึ้นจากอัลกอริทึมอื่นที่เรียกว่า รหัสผ่านแบบใช้ครั้งเดียวแบบใช้ HMAC (HOTP) ซึ่งอิงตาม รหัสตรวจสอบข้อความแบบแฮช (HMAC) . มันคือหัวหอมใหญ่เพียงอันเดียว
TOTP &ร้อนแรง โดยพื้นฐานแล้วเป็นรูปแบบต่างๆ ของข้อความที่ถูกแฮช HMAC เป็นที่ที่เวทมนตร์เกิดขึ้นจริงๆ HMAC สร้างไดเจสต์ซึ่งเป็นเอาต์พุตของการรันค่าบางอย่างผ่านอัลกอริธึมการแฮช มาดูการทำงานกับรหัสทับทิมกัน:
OpenSSL::HMAC.digest("SHA1", "my-secret-key", "the-earth-is-flat")
=> "R\xABp\xCB\xEC\xFEJ\r#\x02\xC8\xAB\x96\xB68\v\xDA0\xD7z"
ว้าว ดูสตริงไบนารีนั่นสิ! นั่นคือ รหัสตรวจสอบข้อความ (MAC) .
เราเลือก SHA1
เป็นฟังก์ชันแฮชของเรา (เช่นเดียวกับการใช้งาน TOTP . ของเรา ). มีฟังก์ชันอื่นๆ ให้เลือกมากมาย โดยแต่ละฟังก์ชันมีความปลอดภัยและประสิทธิภาพการทำงานต่างกันไป สิ่งที่รุนแรงเกี่ยวกับอัลกอริธึมการแฮชคือสำหรับ อินพุตใดๆ เราจะได้ ผลลัพธ์เดียวกัน , ทุกเวลา! นอกจากนี้ยังจะผลิต แตกต่างและไม่เหมือนใครอย่างมากมาย เอาต์พุตจากการเปลี่ยนแปลงอินพุตที่ละเอียดอ่อน (อะแฮ่ม ขึ้นอยู่กับฟังก์ชันแฮช แต่ไม่ต้องกังวล เราไม่ได้กังวลอย่างมากกับการชนกันที่นี่)
โอเค เรียกว่า รหัสตรวจสอบข้อความ เพราะสามารถใช้พิสูจน์ได้ว่าข้อความที่ได้รับนั้นเป็นของแท้ ถ้าคุณและฉันรู้ความลับ (my-secret-key
) ฉันสามารถส่งข้อความ the-earth-is-flat
พร้อมกับ MAC . สิ่งที่คุณต้องทำคือเรียกใช้ฟังก์ชันไดเจสต์ที่เหมือนกันทุกประการ โดยใช้อินพุตเดียวกัน และหาก MAC ตรงกัน แสดงว่าคุณได้ตรวจสอบข้อความแล้ว! คุณก็รู้ว่ามันไม่ได้ถูกดัดแปลงและมีเพียงมาจากฉันเท่านั้น!
😎
รหัสเวลา
ลองนำสิ่งนี้กลับไปที่ TOTP . ได้เวลาพูดถึง เวลา . คุณจะเห็นด้วย TOTP แทนที่จะแยกแยะข้อความไร้สาระเช่น the-earth-is-flat
เราใช้การนับขั้นตอนเวลา (แปลงเป็นสตริง) เป็นอินพุตแทน หากคุณเปิดแอปเครื่องยืนยันตัวตน และคอยดูเมื่อมีการเปลี่ยนรหัส คุณอาจสังเกตเห็นรูปแบบ ใช่แล้ว พูดกับฉันว่า "พวกเขาเปิดนาทีครึ่งนาที" ดีมาก
ทำให้การคำนวณข้อความง่ายขึ้นเล็กน้อย ในกรณีนี้ เราใช้การนับแบบปัดเศษลง 30 วินาที (ขั้นตอนเวลา ) ตั้งแต่ต้นเวลา (ก็เวลา unix) ดังนั้นในทับทิมอีกครั้ง:
Time.now.to_i / 30
=> 51772900
อ่าฮะ! นั่นคือข้อความของเรา .
ดังนั้นในแอป Authenticator เราใช้ฟังก์ชันไดเจสต์ที่เชื่อถือได้เพื่อรับ HMAC . ใหม่ :
hmac = OpenSSL::HMAC.digest("SHA1", "avwe8aw71j2boib23jkbjk32", "51772900")
=> "H\x7F\xC1\xACL\xDA\xDB\xE7DQ\x91kE\x1C\xE3,c\nH\xA0"
get_otp_code(hmac)
=> "332204"
ขั้นตอนสุดท้ายคือการรับรหัสตัวเลขจากสตริงไบนารีนี้ เนื่องจากต้องมีการจัดการเล็กน้อย ฉันจะซ่อนอยู่หลัง get_otp_code
ที่ไม่ระบุตัวตนของเรา ฟังก์ชันสำหรับตอนนี้ หากต้องการ คุณสามารถอ่านเกี่ยวกับวิธีการทำงานได้ใน HOTP Spec
เมื่อคุณส่งรหัสไปยังเซิร์ฟเวอร์ โปรแกรมจะดำเนินการไดเจสต์แบบเดียวกันทุกประการและเปรียบเทียบรหัส เมื่อพวกมันตรงกัน คุณก็พร้อม! เนื่องจากเรากำลังทำงานกับเวลา เวลาแฝงจึงเป็นปัจจัยหนึ่ง มีกลยุทธ์ในการบัญชีสำหรับความล่าช้าที่อาจเกิดขึ้น เข้าใจว่าจะเป็นการบ้านของคุณถ้าคุณต้องการ
นั่นคือสาระสำคัญของวิธีการรหัสผ่านแบบใช้ครั้งเดียวตามเวลา งาน!! 🎉 โปรดส่งอีเมลขอบคุณหลังจากใช้ข้อมูลนี้เพื่อจัดงานเลี้ยงอาหารค่ำครั้งต่อไปของคุณ!
การนำไปใช้
แม้ว่าฉันคิดว่าสิ่งสำคัญคือต้องเข้าใจว่าสิ่งเหล่านี้ทำงานอย่างไร เราไม่แนะนำให้ทำอะไรก็ได้เป็นของตัวเอง ที่เกี่ยวข้องกับการเข้ารหัสลับ สิ่งที่ยอดเยี่ยมอย่างหนึ่งเกี่ยวกับระบบนิเวศของ Ruby / Rails คือคุณมักจะพบอัญมณี (บางครั้งมีมากมาย) เพื่อแก้ปัญหาของคุณ
เราใช้ devise ที่ Honeybadger และมีปลั๊กอินที่ยอดเยี่ยมที่เรียกว่า two_factor_authentication มีการใช้งาน 2FA สองสามแบบให้เลือก ดังนั้นนี่คือเหตุผลบางประการที่เราเลือกใช้สิ่งนี้:
- การตั้งค่าอย่างง่าย (การย้ายข้อมูล การกำหนดค่าและตัวเริ่มต้นบางส่วน)
- อนุญาตให้ป้อนรหัสแบบใช้ครั้งเดียวในหน้าของตัวเอง (หลังจากผู้ใช้/รหัสผ่านที่ถูกต้อง)
- ค่าเริ่มต้นที่ยอมรับได้ แต่ง่ายต่อการแทนที่
- นอกจากนี้ยังมีการตรวจสอบความพยายามในการเข้าสู่ระบบสูงสุด ซึ่งแนะนำโดยข้อมูลจำเพาะ
วิธีเปิดใช้งาน
การตั้งค่าทำได้ง่าย:ไปที่หน้าการตั้งค่าผู้ใช้> การตรวจสอบสิทธิ์ เลือก "ตั้งค่าการตรวจสอบสิทธิ์สองปัจจัย" และทำตามคำแนะนำเพื่อซิงค์ข้อมูลลับโดยใช้ Authy หรือ Google Authenticator (หรือ TOTP อื่น ๆ จริงๆ แอป)
แค่นั้นแหละ! ครั้งต่อไปที่คุณเข้าสู่ระบบ เราจะแจ้งให้คุณใส่รหัสยืนยันตัวตนของคุณ กรอกรหัสและใช้งานได้อย่างสบายใจ 🧘
ความปลอดภัยและความเรียบง่าย? จะดีกว่าไหม
สิ่งสุดท้าย:ตรวจสอบรหัสผ่าน Pwned
ฉันมีข้อมูลด่วนสำหรับผู้ที่เสนอรหัสผ่านที่ไม่รัดกุม เรายังรวมเข้ากับ devise-pwned_password gem จากนี้ไป เมื่อคุณดำเนินการใดๆ ที่ต้องใช้รหัสผ่าน เราจะตรวจสอบเพื่อให้แน่ใจว่ารหัสผ่านที่เสนอจะไม่แพร่หลายในการละเมิดข้อมูลที่ทราบ หากคุณกำลังเพิ่มรหัสผ่านใหม่ และไม่ผ่านการตรวจสอบ เราจะไม่อนุญาต
หากคุณยังไม่ได้ดำเนินการ เรายินดีเป็นอย่างยิ่ง แนะนำให้ใช้ตัวจัดการรหัสผ่าน (1Password ahem)
สิ่งที่น่าสนใจอีกอย่างหนึ่งของ Pwned Password คือวิธีที่รหัสผ่านของคุณยังคงปลอดภัยแม้ในขณะที่ตรวจสอบกับฐานข้อมูลจากบริการของบุคคลที่สาม เรียกว่า k-Anonymity
และคุณสามารถดูภาพรวมได้ที่นี่
นั่นคือทั้งหมดที่เรามีในตอนนี้ จนกว่าจะถึงครั้งต่อไป! 👋