HMAC-Based One-Time Password
1. 개요
HOTP란 HMAC 기반의 OTP 생성 알고리즘이다. 2005년에 RFC 4226 표준으로 제정되었다.TOTP와 다르게 시간이 아닌 횟수를 기준으로 인증 코드를 생성한다.
2. 상세
2.1. RFC 4226
공식 문서RFC 4226은 HOTP에 관한 국제 인터넷 표준화 기구(IETF) 표준으로, 현재 많은 웹사이트에서 사용하고 있는 RFC 6238 표준 TOTP의 기초가 되는 방식이다.[1]
HMAC-SHA-1 값을 HOTP 값으로 변환하는 Truncate() 함수와 secret 값인 K, counter 값인 C로 구성된 HOTP는 다음과 같이 정의된다.
HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))
HOTP 값을 구하는 순서는 다음과 같다.
우선,
HMAC-SHA-1(K,C)를 계산한다. 이 결과는 20바이트 문자열(바이너리)로 나타난다.Truncate() 함수는 계산된 HMAC 값을 우리가 입력할 수 있는 숫자로 바꿔 주는 작업이다. 다음은 그 과정이다.
아까 구한
HMAC-SHA-1(K,C) 값의 맨 마지막 4비트의 값을 추출한다. 이 값을 10진수로 변환하여 오프셋으로 삼는다. 즉, 오프셋은 0에서 15 사이의 값을 갖는다.아까 구한
HMAC-SHA-1(K,C) 값에서 (오프셋 + 1)번째 바이트부터 (오프셋 + 4)번째 바이트까지 총 4바이트 길이의 문자열을 추출한다. 그 다음 맨 앞의 비트를 제하고 뒤의 31비트만을 추출한다.이 값을 10진수로 변환한 후, [math(10^n)]으로 나눈 나머지를 구한다. 여기서 n의 값이 OTP의 자릿수가 되며, 입력의 편의를 위해 보통 6자리를 추출한다. 이론상 10진수로 변환한 값은 2,147,483,647 이하이기 때문에 10진수로 코드를 제공한다면 자릿수 n의 최댓값은 10이다.
2.2. Steam 인증키
HMAC까지는 RFC 4226과 같지만, Truncate() 처리 과정이 약간 다르다.RFC 4226의 방법대로 추출한 31비트의 값을 [math(S)]라고 하자. Steam 인증키에는 A, E, I, L, O, S, U, Z를 제외한 알파벳과 2~9의 숫자가 들어가기 때문에, [math(S \mod 26)]을 계산한다. 아래 표에서 이 값과 일치하는 순번의 문자열이 인증 코드의 첫째 자리가 된다. 그 다음 자릿수는 [math(\biggl\lfloor\dfrac S{26}\biggr\rfloor\mod 26)]의 값과 일치하는 문자이다. 스팀의 인증 코드는 5자리이므로, 이러한 과정으로 5번째 자리까지 찾으면 인증 코드가 온전하게 나온다.
|| 순번 || 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19 || 20 || 21 || 22 || 23 || 24 || 25 ||
| 문자열 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | B | C | D | F | G | H | J | K | M | N | P | Q | R | T | V | W | X | Y |
[1] 아래 식에서 C값을 시간 기준으로 변화시키는 방식이 TOTP이기 때문이다.