OTP 동작 원리에 대해서 정리하기🤔
OTP(One-Time Password)는 한 번만 사용할 수 있는 비밀번호로, 보안 시스템에서 자주 사용되는 인증 방법 중 하나입니다. OTP는 매번 새로운 비밀번호를 생성하므로, 재사용이 불가능하고 보안성이 높습니다.
1. 비밀키 생성 (Secret Key Generation):
사용자와 시스템 간에 공유되는 비밀키(secret key)
가 생성됩니다. 이 비밀키는 암호화 알고리즘
에 사용되며, 매번 다른 비밀키가 생성됩니다.
2. 시간 정보 사용 (Time-Based OTP - TOTP) 또는 카운터 사용 (HMAC-Based OTP - HOTP):
TOTP (Time-Based OTP)
: 특정 시간(예: 30초)마다 새로운 OTP를 생성합니다. 시간 정보와 비밀키를 조합하여 OTP를 계산합니다.
HOTP (HMAC-Based OTP)
: 사용자의 세션 또는 이벤트가 발생할 때마다 새로운 OTP를 생성합니다. 일정한 카운터와 비밀키를 조합하여 OTP를 계산합니다.
3. OTP 생성 (OTP Generation):
TOTP
: 현재 시간 또는 시간 간격을 사용하여 비밀키와 조합하여 일회용 비밀번호를 생성합니다.
HOTP
: 카운터와 비밀키를 조합하여 일회용 비밀번호를 생성합니다.
4. OTP 전달 (OTP Delivery):
사용자에게 생성된 OTP를 안전하게 전달합니다. 일반적으로 모바일 앱(예: Google Authenticator)을 통해 QR 코드를 스캔하거나, 텍스트 형식의 OTP를 입력하도록 유도합니다.
5. OTP 검증 (OTP Verification):
사용자가 입력한 OTP와 시스템에서 생성한 OTP를 비교하여 일치 여부를 확인합니다.
6. 인증 결과 (Authentication Result):
OTP가 일치하면, 인증이 성공하고 사용자에게 접근을 허용합니다.
OTP가 일치하지 않으면, 인증이 실패하고 접근을 거부합니다.
여기서, OTP 암호 기법은 TOTP
와 HTOP
가 사용 된 다는걸 알 수 있는데 다음과 같은 집합으로 나타 낼 수 있다고 한다.
먼저 HOTP
은, HMAC
을 기반으로 하는데 HMAC은 Hash
와 MAC
이 합쳐진 개념이다.
Hash는 일방향 암호화라고도 하며 양방향과 다르게 한번 암호화 된 값을 복호화 하는것이 불가능하다.
MAC은 Message Authentication Code
의 약자로, 송수신자 사이 메시지(데이터)가 변경되지 않았음을 확인할 수 있는 기술이다.
송신자와 수신자 사이에는 둘 사이에만 공유되는 SecretKey가 존재하며 이는 키교환 알고리즘
에 의해 교환된다.
MAC은 메시지에 대한 변조를 확인하기 위해 이러한 SecretKey로 메시지 해시화를 하여 메시지 뒤에 붙인다.
이러한 MAC 기술은 메시지 위변조는 확인할 수 있으나 기밀성 보장은 불가능 하다고 한다.
따라서, 기밀성 보장을 위해 HMAC
을 사용하는데 이는 MAC
을 생성하여 메시지와 MAC값을 Hash 알고리즘
에 의하여 Hash화 한다.
메세지를 확인하기 위해서는 사용자가 보낸 HMAC 값과 자신의 MAC 값을 비교하여 확인한다.
HMAC
을 기반으로 OTP 값을 생성하는 기술을 HOTP
라고 칭하며, 초기 OTP 모델이라고 한다 !!!
HMAC(K, text) = H(K xor Opad + H(K xor Ipad + text))
- K는 Secret Key 제 3자가 알지 못하는 비밀 텍스트
- H는 해시함수 MD5 Sha-256 등 다양한 해시 사용가능
- Opad는 Output padding K의 길이 만큼 0x5C 를 반복
- Ipad는 Output padding K의 길이 만큼 0x36 를 반복
HOTP
는 메시지 대신 Counter
라는 변수를 입력받아 -> HMAC
을 생성한 뒤 -> Truncate
하는 과정을 거친다. 다음 과정을 거친 뒤 6자리의 숫자 코드를 생성한다.
HOTP(K,text) = Truncate(HMAC-SHA-1(K,text))
- K는 Secret Key 제 3자가 알지 못하는 비밀 텍스트
- Truncate는 동적 stirng 자르기
위 사진은 은행에서 사용하는 OTP 단말의 로직인데, Counter
는 메시지를 대체하며, OTP code의 무결성을 확인하기 위해 사용자가 사용한 Counter
와 SecretKey
값이 인정서 서버의 Counter
와 SecretKey
와 같아야 한다.
사용자가 OTP 단말의 버튼을 누를때마다 Counter는 1씩 증가하는데, 인증 서버는 사용자가 인증 성공 할때의 Counter
의 값을 저장해준다.
또한, 앞서 말했던 것 처럼 6자리 코드를 생성하기 위해서는 HMAC
값을 Truncate
하는 작업이 필요한데, 다음과 같은 방식으로 진행된다.
TOTP는 HOTP에서 Counter
값을 시간(Time Stamp)
로 대체하는것을 의미한다.
TOTP = HOTP(K, T)
Counter를 대체하는 시간 값은 아래와 같이 계산된다.
따라서, 시간 값 계산시 사용한 X값이 30이라면 30초
마다 OTP code 값이 바뀌게 된다.
그 외에 OTP code를 생성하는 방식은 HOTP와 동일하다고 한다.
구분 | HOTP | TOTP |
---|---|---|
필요 항목 | Shared Secret Key, Counter | Shared Secret Key, Time Stamp |
HMAC 메시지 | 이벤트 발생 시 값이 증가하는 Counter | 시간에 의존하여 값이 증가하는 Counter |
유효시간 | 예측 불가능 | 30초, 60초 등 |
RFCs | IETF RFC 4226 | RFC 6238 |
위 표에서 나오는 것 처럼 두 OTP의 주요 차이점은 유효시간인데, HOTP의 경우 정해진 기한이 없어 무차별 대입공격을 받을 위험이 있다고 한다.
따라서 짧은 수명주기를 가진 TOTP
를 더 선호하는 추세라고 한다!!!