시간 기반 일회용 비밀번호

시간 기반 일회용 비밀번호(, TOTP)는 현재 시간을 고유성의 원천으로 사용하여 일회용 비밀번호 (OTP)를 생성하는 컴퓨터 알고리즘이다. HMAC 기반 일회용 비밀번호 알고리즘 (HOTP)의 확장으로 국제 인터넷 표준화 기구 (IETF) 표준 로 채택되었다.

TOTP는 개방형 인증 이니셔티브 (OATH)의 초석이며, 다수의 2요소 인증 시스템에 사용된다.

역사 

여러 OATH 회원들의 협력을 통해 업계에서 지원하는 표준을 만들기 위해 TOTP 초안이 개발되었습니다. 이벤트 기반 일회성 표준 HOTP를 보완하고 최종 사용자 조직과 기업이 애플리케이션 요구 사항 및 보안 지침에 가장 적합한 기술을 선택할 수 있는 더 많은 선택권을 제공한다. 2008년, OATH는 IETF에 이 규격의 초안을 제출했다. 이 버전은 IETF에 제출된 이전 버전에 기초하여 저자가 기술 공동체로부터 받은 모든 피드백과 논평을 통합한다. 2011년 5월에 TOTP는 공식적으로 RFC 6238이 되었다.

알고리즘 

TOTP 인증을 설정하려면 인증기와 피인증자가 HOTP 매개 변수와 TOTP 매개 변수를 모두 미리 설정해야 한다:
 T, 시간 간격 카운트가 시작될 유닉스 시간 (기본값은 0),
 T, C 카운터 값을 계산하는 데 사용되는 간격 (기본값은 30초).

인증기와 피인증자는 모두 TOTP 값을 계산한 다음 피인증자가 제공한 TOTP 값이 로컬에서 생성된 TOTP 값과 일치하는지 확인한다. 몇몇 인증기는 약간의 클럭 스큐, 네트워크 지연 및 사용자 지연을 고려하기 위해 현재 시간 이전 또는 이후에 생성되어야 하는 값을 허용한다.

TOTP는 HOTP 알고리즘을 사용하여 카운터를 현재 시간을 기준으로 감소하지 않는 값으로 바꾼다:

TOTP 값(K) = HOTP 값(K, C),

카운터 값 계산

여기에서
 C is the count of the number of durations T between T and T,
 T is the current time in seconds since a particular epoch,
 T is the epoch as specified in seconds since the Unix epoch (e.g. if using Unix time, then T is 0),
 T is the length of one time duration (e.g. 30 seconds).

유닉스 시간은 엄격하게 증가하지 않는다. UTC에 윤초가 삽입되면 유닉스 시간은 1초를 반복한다. 그러나 한번의 윤초는 유닉스 시간의 정수 부분을 감소시키지 않으며, T가 1초의 배수인 한 C도 감소하지 않는다.

보안성 

TOTP 값은 비밀번호처럼 피싱될 수 있지만, 이를 위해서는 공격자가 실시간으로 자격 증명을 프록시해야 한다.

공유 비밀번호를 도용한 공격자는 원하는 대로 유효한 새 TOTP 값을 생성할 수 있다. 이것은 공격자가 대규모 인증 데이터베이스를 위반하는 경우 특히 문제가 될 수 있다.

네트워크와 사람 모두의 레이턴시, 동기화되지 않은 시계로 인해 일회용 비밀번호는 인증기와 피인증자 사이의 시간 범위에 걸쳐 유효성을 검사해야 한다. 여기에서 시간은 당사자 간의 유효성을 허용하기 위해 더 큰 기간(예: 30초)으로 다운샘플링된다. 후속 인증이 작동하려면 피인증자와 인증기의 시계를 대략적으로 동기화해야 한다(인증기는 일반적으로 피인증자의 타임스탬프와 ±1 시간 간격이 다른 타임스탬프에서 생성된 1회용 암호를 수락한다). TOTP 값은 일반적으로 30초 이상 유효하므로 클라이언트 및 서버 시간 지연이 고려된다.

같이 보기 

 Botan
 FreeOTP
 Google Authenticator
 multiOTP

각주

외부 링크 
 Step by step Python implementation in a Jupyter Notebook 
 Designing Docker Hub Two-Factor Authentication, (section "Using Time-Based One-Time Password (TOTP) Authentication").

인터넷 프로토콜
컴퓨터 접근 제어
암호 알고리즘