Time-Based-One-Time-Password의 약자로 일회성 비밀번호 생성을 위해 공유 비밀키와 시간정보를 사용하여 일회성 비밀번호를 생성합니다. 일회성 비밀번호를 전달하지 않아도 됩니다. TOTP는 HMAC과 HOTP 알고리즘이 사용되므로 해당 개념들을 이해해야 합니다.
HMAC은 Hash-based Message Authentication Code의 줄임말로서, 사용자의 Secret Key를 평문과 조합하여 해시를 발생시키고 메세지와 함께 전달함으로써 무결성을 확인하는 매커니즘입니다.
HMAC(Key, message) = SHA1(Key XOR Opad + SHA1(Key XOR Ipad + message))
01001000 01100101 01101100 01101100 01101111
= 0x48656c6c6f
01011100 01011100 01011100 01011100 01011100
= 0x5c5c5c5c5c
00010100 00111001 00110000 00110000 00110011
⇒ 0x1439303033
0x1439303033
0x6162636465
0x759b939498
fe5ce5adc135af4e081618a100a6c7000e350452
0x48656c6c6f
xor 0x3636363636
⇒ 0x48535a5a59
fe5ce5adc135af4e081618a100a6c77e618f5eab
09d5ac5ab199a4956e0528314f54c22beec265dd
HOTP 알고리즘은 해쉬 값을 변환하여 정수로만 이루어진 6자리 값을 반환합니다. 정수로 만들어지는 이유는 입력하기 편한 장점 때문입니다.
HOTP(Key, message) = Truncate(HMAC(Key, message))
8비트 단위로 분할, 20개의 1바이트 값으로 구분
09d5ac5ab199a4956e0528314f54c22beec265dd
| Byte Num | => |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|
| Byte Val | => |09|d5|ac|5a|b1|99|a4|95|6e|05|28|31|4f|54|c2|2b|ee|c2|65|dd|
마지막 8비트(0xdd)에서 끝 4bit를 구한 값을 offset으로 설정
해당 offset (13)에서 4bytes를 가져오고, 첫번째 부호 비트를 제거
0x54c22bee
Decimal로 변환
1422011374
011374
HOTP에서 message를 시간정보T로 사용합니다.
TOTP = HOTP(Key, T)
T를 구하는 공식은 다음과 같습니다.
T = (UT - T0) / (time_step)
HOTP와 동일하게 6자리로 이루어져 있다.