알고리즘

Google authenticator를 사용한 2FA 인증 #1 이론

uzguns 2024. 11. 21. 15:02

system에 로그인 하기 위한 사용자 이름 과 비밀 번호가 있어야한다. 

여기에 보안계층을 추가하기 위해 one time password generator 를 사용할 수 있다. 

Google Authenticator 에서 사용하는 암호기법을 살펴보면 TOTP, HOTP 두가지를 사용한다.

[출처] https://supertokens.com/blog/otp-vs-totp-vs-hotp

 

HOTP(Hmac based One Time Password)

HMAC 기반 일회용 비밀번호(또는 HOTP) 는 Shared Secret 와 Event Counter를 사용하는 이벤트 기반 OTP 알고리즘 이다.

 

HOTP의 핵심은 비밀 키이다. seed라고도 하는 비밀키는 counter 값과 달리 고정된 값이고, 토큰을 초기화하는 동안 otp 토큰과 서버가 한번만 교환하는 값이다. 그런 다음 비밀키는 클라이언트와 서버에 안전하게 저장되며 다시 공유되지 않는다.

 

HOTP 알고리즘에서 카운터는 이벤트에 기반한다. 카운터는 OTP 생성 시마다 증가한다. 서버의 카운터는 모든 성공적인 인증 후에 증가한다. 

 

 

HOTP 인증 흐름을 요약하면

1. 서버와 클라이언트가 동일한 비밀키와 초기 카운터 값을 공유한다.

2. 클라이언트(HOTP 토큰 또는 앱)는 비밀키와 현재 카운터 값을 이용하여 OTP 를 생성한다.

3. 사용자는 서버로 OTP를 제출한다.

4. 서버는 자체 OTP 를 생성하고 해당 값을 사용자 OTP 와 비교한다.

5. 두 OTP가 동일하면 서버는 사용자에게 액세스 권한을 부여한다. 

6. 인증에 성공한 후 서버는 카운터 값을 증가 시켜 다음 인증 요청 시 새로운 otp 를 생성할 준비를 한다.

 

HOTP 는 현재 시간에 의존하지 않고 오직 비밀키와 카운터 값을 기반으로 작동한다. 따라서 서버와 클라이언트가 정확히 동기화된 카운터 값을 유지해야한다.

 

HOTP 알고리즘

HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

HMAC-SHA-1 이 반환한 값은 160 비트이기 때문에 유저가 입력하기 편하도록 변환(truncate) 해야한다.

  • C: 8비트로 된 counter 값 (클라이언트와 서버에 동기화 되어야함)
  • K: 클라이언트와 서버간에 공유된 시크릿 키
    • OTP를 생성할 때 HMAC-SHA-1 해시에 사용되며 각 HOTP 생성기(토큰) 마다 고유하다.

  • T (Throttling Parameter): 인증 실패시 재시도 제한을 구현 
    • 예: T=5T=5이면,
      • 첫 번째 실패 후 대기 시간 = 5*1초.
      • 두 번째 실패 후 대기 시간 = 5*2초.
      • 세 번째 실패 후 대기 시간 = 5*3초.
  • s (Resynchronization Parameter): 클라이언트와 서버 간의 카운터 값이 동기화되지 않았을 때 사용
    • 클라이언트의 카운터 값은 OTP 생성할 때마다 증가하지만,
    • 서버의 카운터 값은 인증에 성공했을 때만 증가한다.
    • 클라이언트와 서버의 카운터 값이 어긋나면 인증 실패가 발생할 수 있으므로 서버는 재동기화를 수행해야한다.
      • 동작 방식
        • 서버는 현재 카운터 값 부터 s개의 값(예: s = 10) 을 확인하며, 클라이언트 값과 일치하는 otp가 있는지 검사한다.
        • 예를 들어 서버의 카운터 값이 50이고 클라이언트가 52에서 생성한 otp를 제출하면 서버는 50~60 범위를 탐색해 일치하는지 확인한다.
  • HMAC-SHA-1(K, C): K(시크릿 키)와 C(카운터 값) 을 기반으로 생성된 160비트 해시 값
  • Truncate: 160비트 해시 값을 사람이 읽기 쉬운 형태 (예: 6자리 또는 8자리 숫자)로 변환

 

HMAC 알고리즘

MAC

HOTP 값은 HMAC-SHA-1 알고리즘을 사용하여 구한다.

secret key 로 어떤 값을 확인하는 메커니즘을 message authentication codes (MAC)이라고 한다.

그리고 이를 해싱 함수로 암호화한 것을 HMAC 메커니즘이라 한다.

 

Hash

hash는 다양한 길이를 가진 데이터를 고정된 길이의 데이터로 반환한 값이다.

단방향으로만 사용할 수 있어 암호화된 결과값과 암호화할 때 사용한 해시값을 알더라도 원본이 무엇인지 찾을 수 없다. 

  • 대표적으로 MD5, SHA-1 알고리즘

HMAC

HMAC은 메시지 무결성과 인증을 보장하기 위한 알고리즘으로 

해시 함수(SHA-1, MD5 등)를 기반으로 시크릿 키(Secret Key)를 활용하여 안전한 해시 값을 생성한다.

HMAC의 목적은 데이터가 전송 중 변조되지 않았으며, 메시지가 인증된 출처로부터 왔음을 보장하는 것이다.

 

HMAC의 계산 과정은 아래와 같은 공식으로 표현된다.

HMAC(K, text)  =  H(K xor Opad + H(K xor Ipad + text))
  • K: 비밀 키 (Secret Key)
  • OpadOpad: Output Padding, 0x5C로 채워진 값
  • IpadIpad: Input Padding, 0x36로 채워진 값
  • HH: 해시 함수 (예: SHA-1, SHA-256)
  • text: 인증하려는 메시지

 

HMAC 계산의 핵심 요약 

1. 2단계 해싱 과정

  • K⊕Ipad+text → 해시
  • K⊕Opad+첫 번째 해시 결과 → 최종 HMAC

2. Ipad, Opad 의 역할

  • 서로 다른 값으로, 내부 해싱과 외부 해싱의 차이를 만듬
  • 중간 해싱 단계가 동일한 경우라도, 서로 다른 HMAC을 생성하도록 설계

 

HMAC 계산 과정

 

이 두가지 연산 후 최종 출력은 123456 과 같은 인간이 읽을 수 있는 숫자 문자열이다.

 

[출처] https://devsokuri.tistory.com/3

1. K, padding 값 예시

  • K="Hello"→ASCII 값: 0x48656c6c6f
  • Ipad=0x3636363636
  • Opad=0x5C5C5C5C5C

2. k xor Ipad

  • K XOR Ipad=0x48656c6c6f⊕0x3636363636=0x1439303033

3. k xor Ipad + text :인증하려는 메세지 text를 K XOR Ipad 에 붙임

  • text="abcde"→0x6162636465
  • K XOR Ipad + text=0x1439303033+0x6162636465

4. sha-1(k xor Ipad + text) :위에서 계산한 값을 SHA-1 해시 함수에 입력하여 해시값을 생성한다.

  • SHA-1(K⊕Ipad+text)=fe5ce5adc135af4e081618a100a6c7000e350452

5. k xor Opad: k와 Opad 를 xor 연산한다.

  • K XOR Opad=0x48656c6c6f⊕0x5C5C5C5C5C=0x759b939498

6. k xor Opad + SHA-1(k xor Ipad + text): k xor Opad 에 이전 단계에서 계산한 해시값을 이어 붙인다.

  • K XOR Opad + SHA-1(K XOR Ipad + text)=fe5ce5adc135af4e081618a100a6c77e618f5eab

7. sha-1(k xor Opad + sha-1(k xor Ipad + text): 위 결과를 다시 SHA-1 해시 함수에 입력하여 최종 HMAC 값을 생성한다.

  • HMAC=SHA-1(K XOR Opad + SHA-1(K XOR Ipad + text))=09d5ac5ab199a4956e0528314f54c22beec265dd

8. 최종 HMAC 값은  09d5ac5ab199a4956e0528314f54c22beec265dd

 

 

TOTP(Time based One-Time Password)

[출처] https://velog.io/@ailab/TOTP-HMAC-HOTP-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

TOTP는 HOTP에서 Counter 값을 시간(Time Stamp)으로 대체하는 것을 의미한다.

특정 시간(예: 30초) 마다 새로운 otp 를 생성한다. 시간 정보와 비밀키를 조합하여 otp 를 계산한다.

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

 

계산 식에서 알 수 있듯이 HOTP와 유사하고 T를 구하는 것이 TOTP알고리즘의 전부일 것이다.

 

References