HOTP
HOTP (HMAC 기반 일회용 비밀번호, RFC 4226)는 TOTP의 카운터 기반 형제예요. TOTP가 시계로 진행되는 반면, HOTP는 토큰과 서버 양쪽이 매 코드 사용 시 증가시키는 공유 카운터로 진행해요. HOTP는 YubiKey OATH, 레거시 하드웨어 토큰, 서버가 시계 동기화에 의존할 수 없는 일부 뱅킹 흐름의 표준 모드예요.
공식 사양:RFC 4226, HOTP: An HMAC-Based One-Time Password Algorithm (2005).
URI scheme:Google Authenticator Key URI Format, 모든 인증 앱이 동의하는
관련 규격:TOTP (RFC 6238), HOTP 위에 구축된 시간 기반 변형.
URI scheme:Google Authenticator Key URI Format, 모든 인증 앱이 동의하는
otpauth:// 스킴. 관련 규격:TOTP (RFC 6238), HOTP 위에 구축된 시간 기반 변형.
개요
HOTP 등록 QR은 hotp를 유형으로 하는 otpauth:// 스킴의 URL이에요. 공유 HMAC 시크릿과 양쪽이 동기화 상태를 유지해야 하는 카운터 값을 담아요. 형식:
otpauth://hotp/LABEL?secret=SECRET&issuer=ISSUER&counter=N&digits=N&algorithm=ALG- LABEL,
Issuer:Account, URL 인코딩됨. 예:YubiKey:alice@example.com. - secret, 공유 HMAC 키, Base32 인코딩(RFC 4648 §6: A-Z, 2-7).
- counter, 시작 카운터 값. 보통
0이지만 토큰을 다시 등록할 때 알려진 값에서 재개할 수 있어요. - issuer, 인증 앱에 표시되는 서비스 이름.
- digits,
6(기본값) 또는8. RFC 4226 §5.3은 6을 지정. 8은 일반적인 확장이에요. - algorithm, 실제로
SHA1. RFC 4226은 SHA1만 정의해요. SHA256/512 변형은 나중에 추가된 RFC 6238 확장이에요.
HOTP vs TOTP, 어떤 것을 써야 하나요
| 속성 | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| 진행 기준 | 카운터 (각 성공적인 사용 시) | 시계 (30초마다) |
| 시계 동기화 필요 | 아니오 | 예, ~30초 이내 편차 |
| 편차 시 재동기 | 서버가 다음 N개 카운터 값 수용 | 서버가 ±1 윈도우 수용 |
| 일반적인 배포 | YubiKey, 레거시 하드웨어 토큰, 오프라인 뱅킹 | 모든 소비자 2FA, Google, Microsoft, 1Password, Authy |
| 카운터 재사용 | 치명적, 시간이 지남에 따라 시크릿 노출 | 해당 없음 |
| 시크릿 유출 시 취약점 | 미래 모든 코드 예측 가능 | 과거 및 미래 모든 코드 예측 가능 |
표준 테스트 벡터
RFC 4226 부록 D는 시크릿 12345678901234567890 (20바이트, Base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ)에 대한 6자리 HOTP 참조값을 제공해요:
| 카운터 | HOTP (6자리) |
|---|---|
0 | 755224 |
1 | 287082 |
2 | 359152 |
3 | 969429 |
4 | 338314 |
5 | 254676 |
6 | 287922 |
7 | 162583 |
8 | 399871 |
9 | 520489 |
카운터 0에서 등록을 위한 최소 QR 페이로드:
otpauth://hotp/Example:test?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Example&counter=0라이브 Base32 시크릿 검증기
TOTP 페이지와 동일한 검증기예요. HOTP 시크릿도 동일한 Base32 알파벳(RFC 4648 §6: A-Z, 2-7)을 사용해요. 브라우저에서 실행돼요.
시크릿을 입력해 확인하세요.
흔한 함정
- 카운터 편차. 사용자가 토큰 버튼을 누르지만 서버가 코드를 기록하지 않으면 토큰 카운터가 서버 카운터보다 앞서가요. 서버는 "재동기 윈도우"로 처리합니다. YubiKey의 기본 윈도우는 ~3이며, 보안이 높은 배포에서는 1로 좁혀요.
- 카운터 재사용은 치명적이에요. 같은 카운터 값을 두 번 절대 수용하지 마세요. RFC 4226 §7.3은 서버가 마지막으로 수용된 카운터 이하의 모든 코드를 거부할 것을 의무화해요.
- 백업 시 카운터 내보내기. HOTP 항목을 내보내는 인증 앱이 시크릿은 내보내지만 현재 카운터는 내보내지 않을 수 있어요. 새 기기로 가져오면 카운터가 0으로 재시작되어 서버와 불일치가 생겨요.
- Base32, Base64 아니에요. TOTP와 동일한 규칙:
0,1,8,9, 소문자,+,/가 있는 시크릿은 Base64이며 모든 RFC 준수 인증 앱에서 거부돼요. - 실제로는 SHA1만. RFC 4226은 HMAC 함수로 SHA1을 정의해요. SHA256/SHA512는 대부분의 HOTP 하드웨어 토큰에서 구현되지 않아요.
- 자릿수 파라미터가 종종 무시돼요. 많은 하드웨어 토큰은 6자리로 고정되어 있어요. 실제 하드웨어로 확인하세요.
- HOTP와 TOTP를 같은 QR에 혼합하지 마세요. URI 스킴은
TYPE세그먼트(hotpvstotp)로 모드를 전환해요. 하나의 시크릿이 두 흐름을 모두 지원할 수 있지만, 둘이 시크릿을 공유하므로 하나가 침해되면 둘 다 실패해요.
인증 앱 호환성
| 앱 / 토큰 | HOTP | SHA256/512 | 8자리 | 비고 |
|---|---|---|---|---|
| YubiKey Authenticator (iOS/Android/데스크톱) | 예 | 예 | 예 | HOTP는 YubiKey OATH의 표준 모드예요. 완전한 RFC 4226 지원. |
| Google Authenticator | 예 | 무시됨 (SHA1만) | 무시됨 (6만) | 사실상 기준. HOTP는 지원하지만 6자리 SHA1만. |
| 1Password | 예 | 예 | 예 | 완전한 RFC 지원. 카운터가 항목과 함께 저장 및 내보내져요. |
| Bitwarden | 예 | 예 | 예 | 완전한 RFC 지원. |
| Microsoft Authenticator | 예 | 예 | 예 | 완전한 RFC 지원. |
| Authy | 아니오 | , | , | 최근 버전에서 HOTP 제거됨. TOTP 전용. |
| Duo Mobile | 아니오 | , | , | 자체 푸시 플로우 사용. TOTP 전용 폴백. |
| OATH 하드웨어 토큰 (Feitian, Token2 등) | 예 | 다양함 | 다양함 | 표준 하드웨어 HOTP. 데이터시트에 다른 내용이 없으면 항상 6자리 SHA1. |
관련 항목
- /hotp-qr-code/, 라이브 카운터 및 Base32 검증이 있는 HOTP 생성기.
- /standards/totp/, 시간 기반 형제 (RFC 6238).
- /totp-2fa-qr-code/, TOTP 생성기.
- /standards/, 표준 인덱스로 돌아가기.