TOTP & HOTP
TOTP (รหัสผ่านแบบใช้ครั้งเดียวอ้างอิงเวลา, RFC 6238) และ HOTP (รหัสผ่านแบบใช้ครั้งเดียวอ้างอิง HMAC, RFC 4226) คือ RFC สองตัวที่ QR ลงทะเบียน 2FA ทุกตัวใช้งาน scheme URI otpauth:// ที่เข้ารหัสคือมาตรฐาน de facto ของ Google Authenticator และเข้ากันได้กับทุกแอปยืนยันตัวตนหลัก
ข้อกำหนด TOTP:RFC 6238 (อ้างอิงเวลา, 2011).
ข้อกำหนด HOTP:RFC 4226 (อ้างอิงตัวนับ, 2005).
URI scheme:Google Authenticator Key URI Format, รูปแบบที่ทุกแอปยืนยันตัวตนยอมรับ
ข้อกำหนด HOTP:RFC 4226 (อ้างอิงตัวนับ, 2005).
URI scheme:Google Authenticator Key URI Format, รูปแบบที่ทุกแอปยืนยันตัวตนยอมรับ
ภาพรวม
QR ลงทะเบียน 2FA คือ URL ใน scheme otpauth:// ที่บรรจุ shared secret พร้อมข้อมูลเมตาสำหรับระบุตัวตน รูปแบบ:
otpauth://TYPE/LABEL?secret=SECRET&issuer=ISSUER&algorithm=ALG&digits=N&period=SEC- TYPE,
totp(อ้างอิงเวลา) หรือhotp(อ้างอิงตัวนับ) - LABEL,
Issuer:Account, URL-encoded ตัวอย่าง:GitHub:alice@example.com - secret, คีย์ที่ใช้ร่วมกัน เข้ารหัส Base32 (ตัวอักษร RFC 4648 §6: A-Z, 2-7)
- issuer, ชื่อบริการที่แสดงในแอปยืนยันตัวตน ซ้ำซ้อนกับ label แต่ช่วยปรับปรุง UX สำหรับแอปที่ไม่แยกวิเคราะห์ label
- algorithm,
SHA1(ค่าเริ่มต้น),SHA256หรือSHA512ทุกแอปรองรับ SHA1 รองรับ SHA256/SHA512 น้อยกว่า - digits,
6(ค่าเริ่มต้น) หรือ8แอปผู้บริโภคส่วนใหญ่คาดหวัง 6 - period, เฉพาะ TOTP เท่านั้น
30(ค่าเริ่มต้น) หรือ60วินาที HOTP ใช้พารามิเตอร์counterแทน
Test vector มาตรฐาน
| กรณี | ข้อมูลนำเข้า | URI otpauth:// ที่คาดหวัง |
|---|---|---|
| TOTP, ขั้นต่ำ (SHA1, 6 หลัก, 30 วินาที) | issuer=GitHub | otpauth://totp/GitHub:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub |
| TOTP, SHA256, 8 หลัก | issuer=Corp | otpauth://totp/Corp:bob?secret=JBSWY3DPEHPK3PXP&issuer=Corp&algorithm=SHA256&digits=8 |
| HOTP, counter=0 | issuer=YubiKey | otpauth://hotp/YubiKey:carol?secret=JBSWY3DPEHPK3PXP&issuer=YubiKey&counter=0 |
| TOTP, secret อ้างอิง RFC 6238 | issuer=Example | Secret ทดสอบ RFC มาตรฐาน (12345678901234567890) สร้าง TOTP 94287082 ที่ T=59 วินาที |
ตัวตรวจสอบ secret Base32 สด
แอปยืนยันตัวตนปฏิเสธ secret ที่มีตัวอักษรนอกเหนือจากตัวอักษร Base32 (A-Z, 2-7) ด้านล่างคือตัวตรวจสอบเดียวกับที่ Abundera ใช้ inline ในตัวสร้าง TOTP ทำงานในเบราว์เซอร์
ใส่ secret เพื่อตรวจสอบ
จุดที่มักพลาด
- Base32 ไม่ใช่ Base64. Base64 ใช้ A-Z, a-z, 0-9, +, / ถ้า secret มีตัวพิมพ์เล็กหรือตัวเลข 0, 1, 8, 9 แสดงว่าเป็น Base64 และทุกแอปที่เป็น RFC จะปฏิเสธ
- ความยาว secret. RFC 4226 §4 แนะนำอย่างน้อย 128 บิต (26 ตัวอักษร Base32) สำหรับ HOTP และ 160 บิต (32 ตัวอักษร) สำหรับ TOTP Secret ที่ต่ำกว่า 80 บิต (16 ตัวอักษร) ถูกต้องตาม technical แต่จะถูกแสดงว่าอ่อนแอ
- การรองรับ algorithm แตกต่างกัน. Google Authenticator ไม่สนใจพารามิเตอร์
algorithmและใช้ SHA1 เสมอ SHA256/SHA512 จะมีผลจริงก็ต่อเมื่อผู้ใช้ใช้ 1Password, Authy, Bitwarden หรือ Microsoft Authenticator - การรองรับจำนวนหลักแตกต่างกัน. แอปยืนยันตัวตนส่วนใหญ่ไม่สนใจ
digits=8และตัดเป็น 6 อย่างเงียบๆ ถ้า OTP 8 หลักสำคัญ ให้ทดสอบกับแอปยืนยันตัวตนที่ต้องการก่อนเปิดตัว - URL-encode label. ตัวอักษรพิเศษใน issuer หรือ account (
:,@, ช่องว่าง) ต้อง percent-encode ใน label ไม่เช่นนั้นแอปยืนยันตัวตนรุ่นเก่าจะลบ label ทิ้งทั้งหมด Abundera จัดการอัตโนมัติ - อย่าใช้ secret ซ้ำ. ทุก account ต้องการ secret แบบสุ่มด้วยวิธีทางคริปโทกราฟีใหม่ การใช้ secret ซ้ำข้ามบริการหมายความว่าถ้าหนึ่งถูกละเมิดทุกอันจะตกอยู่ในความเสี่ยง
- ที่เก็บข้อมูลสำคัญกว่า QR. QR คือการ bootstrap ครั้งเดียว แอปยืนยันตัวตนเก็บ secret หลังการสแกนครั้งแรก ถ้า secret นั้นถูกส่งออกเป็น plain text ในภายหลัง (บางแอปทำ) การรั่วของดิสก์ครั้งเดียวทำให้ทุก 2FA ถูกโจมตีได้
ความเข้ากันได้ของแอปยืนยันตัวตน
| แอป | TOTP SHA1 | TOTP SHA256/512 | HOTP | 8 หลัก | หมายเหตุ |
|---|---|---|---|---|---|
| Google Authenticator | ใช่ | ไม่สนใจ | ใช่ | ไม่สนใจ | มาตรฐาน de facto เป้าหมายแรกเสมอ |
| 1Password | ใช่ | ใช่ | ใช่ | ใช่ | รองรับ RFC ครบถ้วน |
| Authy | ใช่ | ใช่ | ไม่ | ใช่ | ตัดออก HOTP ในเวอร์ชันใหม่ |
| Bitwarden | ใช่ | ใช่ | ใช่ | ใช่ | รองรับ RFC ครบถ้วน |
| Microsoft Authenticator | ใช่ | ใช่ | ใช่ | ใช่ | รองรับ RFC ครบถ้วน |
| YubiKey Authenticator | ใช่ | ใช่ | ใช่ | ใช่ | HOTP คือโหมดมาตรฐานของ YubiKey OATH |
| Duo Mobile | ใช่ | ไม่สนใจ | ไม่ | ไม่สนใจ | ใช้ push flow ของตัวเอง TOTP เป็นเพียง fallback |
ดูเพิ่มเติม
- /totp-2fa-qr-code/, ตัวสร้าง TOTP พร้อม Base32 validator ในตัว
- /hotp-qr-code/, HOTP แบบอ้างอิงตัวนับ
- /standards/, กลับไปที่ดัชนีมาตรฐาน