One Time Password(OTP)의 개념 및 동작방식. LDAP을 활용한 OTP 인증.

안녕하세요. 컨설팅사업본부 김현우 대리라고합니다.

이번 글에선 OTP에 대한 개념 및 동작방식, LDAP을 통한 OTP 인증 구성에 대한 간략한 설명을 해보고자 합니다.

먼저 OTP에 대한 개념을 설명드리면,
OTP는 One Time Password의 약자로 1회용 인증수단을 의미합니다.
이는 Multi Factor Authentication(다중 인증)의 수단으로도 사용됩니다.

OTP는 보안성이 보장되어야 하는 서비스에 적용할 수 있으며, 임의의 비밀번호를 특정 주기마다 생성하여 제 3자에 의한 해킹이나 주요정보의 외부 노출 위험으로부터 보다 안전하게 서비스를 제공할 수 있게 해줍니다.

이러한 OTP 값은 OTP를 사용하는 개인과 인증 서버만 공유하게 되며,
우리가 은행에서 받는 OTP 단말이 흔히 OTP를 설명할 때 가장 많이 사용되는 예시입니다.

요즘은 이러한 단말 외에 네트워크 시스템에서 2차 인증의 수단으로도 사용되며,
Google OTP를 사용하는 것이 그 예시입니다.

이러한 OTP의 종류는 값을 생성하는 방법에 따라 크게 HOTP(HMAC Based OTP)와 TOTP(Time Based OTP) 등 2가지가 존재합니다.
HOTP부터 먼저 살펴보도록 하겠습니다.

HOTP는 이름에서 알 수 있듯이 HMAC을 기반으로 합니다.
HMAC은 Hash와 MAC이 합쳐진 개념입니다.

Hash는 일방향 암호화라고도 하며 양방향 암호화와 다르게 한번 암호화 된 값을 복호화 할 수 없습니다.
* 양방향 암호화의 종류 : 대칭키 암호화, 비대칭키 암호화

MAC은 Message Authentication Code의 약자로, 송수신자 사이 메시지(데이터)가 변경되지 않았음을 확인할 수 있는 기술입니다.
송신자와 수신자 사이엔 둘 사이에만 공유되는 SecretKey가 존재하며 이는 키교환 알고리즘에 의해 교환됩니다.

MAC은 메시지에 대한 변조를 확인하기 위해 이러한 SecretKey로 메시지 해시화 하여 메시지 뒤에 붙입니다.

MAC을 통한 메시지 확인은, 사용자가 보낸 메시지로 MAC값을 생성하고 사용자가 보낸 MAC 값과 자신이 생성한 MAC 값을 비교하여 확인합니다.

이러한 MAC 기술은 메시지의 위변조를 확인할 수 있지만, MAC 값의 기밀성은 보장할 수 없습니다.
따라서, 기밀성 보장을 위한 HMAC을 사용하게 됩니다.

HMAC은 MAC을 생성하여 메시지와 MAC 값을 Hash 알고리즘에 의해 Hash화 합니다.
메시지를 확인하는 방법은 사용자가 보낸 HMAC 값과 자신의 MAC 값을 비교하여 확인합니다.

Hash와 MAC, HMAC에 대해 간단히 설명하였습니다.
이러한 HMAC을 기반으로 OTP 값을 생성하는 기술을 HOTP라고 칭합니다.
HOTP는 Event Based OTP라고도 하며, 초기 OTP의 모델입니다.

HOTP는 메시지 대신 Counter라는 변수를 입력받아 HMAC을 생성한 뒤 Code 생성을 하기 위해 Truncate 과정을 거칩니다.
* Truncate에 대해선 추 후 설명하겠습니다.
HOTP에 의해 생성된 Code는 6자리 숫자 코드가 됩니다.

HOTP의 동작방식은 은행에서 사용하는 OTP 단말을 예시로 설명드리겠습니다.
그림을 예로 들면 로직은 아래와 같습니다.

Counter는 메시지를 대체하며, HMAC에서 설명드렸듯이 OTP Code의 무결성을 확인하기 위해선 사용자가 사용한 Counter와 SecretKey 값이 인증서버의 Counter와 SecretKey와 같아야 합니다.
사용자가 OTP 단말의 버튼을 누를 때 마다 Counter는 1씩 증가합니다.
인증서버는 OTP 단말의 ID와 사용자가 인증에 성공하였을 때의 Counter 값을 저장해 놓습니다.
사용자가 OTP 단말의 Code를 이용하여 인증을 받는 로직은 아래와 같습니다.

Counter가 3일 때 사용자 인증이 성공하였다면, 인증 서버에선 OTP 단말 ID 정보에 Counter 3을 저장합니다.
사용자가 OTP 단말을 3번 눌러 Counter가 6이 된 상태로 Code를 제출하여 인증을 시도합니다.
인증서버는 동일한 OTP Code값을 확인할 때 까지 Counter 값을 1씩 증가시키며 OTP Code 값을 비교합니다.
맞는 Code값이 발생하면 해당 Code 값에 대한 Counter 값을 다시 저장합니다.

참고 사항으로, Counter 값을 무수히 많이 증가시킨 뒤 Code값을 제출할 경우, 인증서버에선 Counter 값을 일정 값 만큼 증가시켜 비교한 뒤 인증 실패 메시지를 반환합니다.
OTP 단말에서 이 제한된 횟수 보다 더 크게 Counter를 증가시킨 뒤 인증이 실패하면 HOTP System에선 Counter 동기화 작업을 진행합니다.

앞 서 설명드렸듯이 6자리 OTP Code 값을 생성하기 위해선 HMAC 값을 Truncate 하는 작업이 필요합니다.
Truncate는 아래와 같이 진행됩니다.

1. Counter, SecretKey, HMAC 알고리즘으로 생성 된 Hash는 20 Byte의 길이를 같습니다.
Ex} bfc72c78a8ee233f27b658838990d226d26f5b8a
2. Hash는 16진수 형식이며, Hash 값을 Byte 단위로 나눕니다. 1개의 16진수는 4bit와 같으므로 2개의 16진수가 1Byte가 되며 아래와 같이 그룹화 됩니다.

3. 여기서 마지막 4Bit의 수로 그룹의 Offset을 확인한 뒤 해당 Offset의 다음 세가지 그룹까지 16진수가 추출됩니다. 이를 DBC(Dinamic Binary Code)라고 합니다.

– 마지막 4Bit의 16진수는 ‘a’이므로 10의 Offset을 갖게되며 10부터 13까지의 16진수가 DBC가 됩니다.(0x58838990)
4. DBC의 첫 Byte는 0x7f와 And 연산을 수행합니다.(MASK 연산)
– 0x7f & 0x58 = 0x58
5. 연산의 수행이 완료된 DBC는 0x58838990이 되며, 이를 10진수로 치환하면 1485015440이 됩니다.
6. 10진수로 치환된 DBC 값을 10의 6승으로 Mod 연산을 합니다.
7. 모든 연산을 마치고 발행된 HOTP Code는 15440이 되며, 6자리가 안될 경우 맨 앞에 0을 추가합니다.
8. 최종적으로 사용자가 확인하는 HOTP Code 값은 015440이 됩니다.

여기까지 HOTP의 동작방식 및 생성에 대해 설명드렸습니다.
다음으로 TOTP에 대해 설명드리겠습니다.

TOTP는 HOTP에서 Counter 값을 시간에 의한 값(Time Stamp)으로 대체합니다.
Counter를 대체하는 시간 값은 아래와 같이 계산됩니다.

따라서, 시간 값 계산 시 사용한 ‘X’의 값이 30이라면 30초 마다 OTP Code 값이 바뀌게 됩니다.
Google OTP 사용 시 OTP Code 값의 유효시간을 보셨을 것 입니다. Google OTP는 TOTP를 사용하므로, 시간 값에 따른 유효시간을 갖습니다.
* 그 외 OTP Code를 생성하는 방식은 HOTP와 동일합니다.

HOTP vs TOTP

– 두 OTP의 주요 차이점은 유효시간입니다. HOTP는 이로인해 무차별 대입공격을 통해 HOTP 값을 추측할 수 있게 됩니다.
– 따라서, 짧은 수명을 가진 TOTP를 더 선호합니다.

Google OTP와 LDAP을 이용한 OTP 인증에 대해 설명드리겠습니다.
먼저 Google OTP를 사용하기 위한 구성을 아래와 같이 하였다고 가정합니다.

사용자에 의한 OTP 발급진행은 아래와 같습니다.

Web 서버는 사용자 ID에 따른 SecretKey를 생성하고 이를 LDAP에 저장합니다.
LDAP에 SecretKey를 저장한 뒤, SecretKey를 이용하여 Google OTP QR Code를 생성합니다.
Google Authenticator App으로 해당 QR Code를 스캔하여 OTP Code를 발급합니다.
사용자는 ID/PW로 로그인 한 뒤 App에서 출력된 6자리 OTP Code를 입력하여 2차 인증을 받습니다.

여기까지 OTP에 대해 알아보고 2차 인증 수단으로써 OTP 사용 시 LDAP을 활용하는 방안도 확인하였습니다.

다음 게시글에선 실제 Web 서버를 구성하고 Java(Eclipse) 및 Google Authenticator App을 이용한 OTP 인증을 실제로 실습해보도록 하겠습니다.

추가 문의사항은 댓글부탁드립니다.
감사합니다.


답글 남기기