TOTP (HMAC, HOTP) 알고리즘

마이클의 AI 연구소·2022년 2월 9일
0

TOTP

Time-Based-One-Time-Password의 약자로 일회성 비밀번호 생성을 위해 공유 비밀키와 시간정보를 사용하여 일회성 비밀번호를 생성합니다. 일회성 비밀번호를 전달하지 않아도 됩니다. TOTP는 HMAC과 HOTP 알고리즘이 사용되므로 해당 개념들을 이해해야 합니다.

HMAC

HMAC은 Hash-based Message Authentication Code의 줄임말로서, 사용자의 Secret Key를 평문과 조합하여 해시를 발생시키고 메세지와 함께 전달함으로써 무결성을 확인하는 매커니즘입니다.

HMAC의 구현

HMAC(Key, message)  =  SHA1(Key XOR Opad + SHA1(Key XOR Ipad + message))

  • Key : Secret Key 제 3자가 알지 못하는 비밀 텍스트
  • SHA1 (20 bytes): SHA1, SHA256, MD5 등
  • Opad : Output padding K의 길이 만큼 XOR 0x5C 를 반복
  • Ipad : Output padding K의 길이 만큼 XOR 0x36 를 반복

HMAC의 예시

  1. Key XOR Ipad
    • Key "Hello" 01001000 01100101 01101100 01101100 01101111 = 0x48656c6c6f
    • Ipad 01011100 01011100 01011100 01011100 01011100 = 0x5c5c5c5c5c
    • K XOR Ipad 00010100 00111001 00110000 00110000 001100110x1439303033
  2. Key XOR Ipad + message "abcde"
    • Key XOR Ipad = 0x1439303033
    • message "abcde" = 0x6162636465
    • Key XOR Ipad + message "abcde" ⇒ 0x759b939498
  3. SHA1(Key XOR Ipad + message "abcde") ⇒ fe5ce5adc135af4e081618a100a6c7000e350452
  4. Key XOR Opad
    • 0x48656c6c6f xor 0x36363636360x48535a5a59
  5. Key XOR Opad + SHA1(Key XOR Ipad + message)
    • fe5ce5adc135af4e081618a100a6c77e618f5eab
  6. SHA1(Key XOR Opad + SHA1(Key XOR Ipad + message))
    • 09d5ac5ab199a4956e0528314f54c22beec265dd

HOTP

HOTP 알고리즘은 해쉬 값을 변환하여 정수로만 이루어진 6자리 값을 반환합니다. 정수로 만들어지는 이유는 입력하기 편한 장점 때문입니다.

HOTP 구현

HOTP(Key, message) = Truncate(HMAC(Key, message))

  1. 8비트 단위로 분할, 20개의 1바이트 값으로 구분

    • HMAC : 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|
  2. 마지막 8비트(0xdd)에서 끝 4bit를 구한 값을 offset으로 설정

    • 끝 4bit를 구하려면 0xdd를 0xf로 AND연산 하면 됨
    • 13 (0xd)
  3. 해당 offset (13)에서 4bytes를 가져오고, 첫번째 부호 비트를 제거

    • 0x54c22bee
    • 맨 앞자리 0x54를 0x7f와 AND 연산하면 부호 비트 제거됨
  4. Decimal로 변환

    • 1422011374
    • 최종적으로 10의 거듭제곱으로 나누어 6자리를 추출함
    • 011374

TOTP

HOTP에서 message를 시간정보T로 사용합니다.

TOTP = HOTP(Key, T)

T를 구하는 공식은 다음과 같습니다.

T = (UT - T0) / (time_step)
  • UT : 1970-01-01 이후 경과된 시간
  • T0 : 시스템 파라미터 (OTP가 갱신된 횟수를 사용)
  • time_step : 유효시간
  • 유효시간을 나눈 몫을 사용하면 동일한 유효시간안에는 같은 값을 얻을 수 있음

HOTP와 동일하게 6자리로 이루어져 있다.

profile
늘 성장을 꿈꾸는 자들을 위한 블로그입니다.

0개의 댓글