TOTP(일회용 비밀번호) 생성기

Base32 형식의 TOTP 시크릿으로부터 Google Authenticator 등과 동일한 6자리 일회용 비밀번호(RFC 6238)를 브라우저 안에서만 생성합니다. 시크릿은 서버로 전송되지 않습니다.

이 도구는 시크릿을 서버로 전송하지 않습니다. Base32 디코딩과 HMAC 계산은 모두 브라우저 내부(Web Crypto API)에서 완결되므로 인증 정보를 안심하고 입력할 수 있습니다.

TOTP 알고리즘 소개

TOTP(Time-based One-Time Password)는 RFC 6238에 정의된 시간 기반 일회용 비밀번호 생성 알고리즘입니다. 공유 시크릿과 현재 시각을 일정 간격의 카운터로 변환한 뒤, HOTP(RFC 4226)와 동일한 동적 절단(dynamic truncation) 알고리즘으로 숫자 코드를 도출합니다.

HMAC 알고리즘 SHA-1(기본값), SHA-256, SHA-512 중 선택 가능
코드 자릿수 6자리(Google Authenticator 등 주요 2FA 앱과 동일한 표준 자릿수)
갱신 주기 30초마다 새로운 코드로 전환됩니다

이용 팁

  • 시크릿은 2단계 인증(2FA)을 처음 등록할 때 QR 코드 아래 등에 표시되는 "설정 키" 문자열입니다. 이미 스마트폰 인증 앱에 등록되어 있다면 동일한 시크릿을 이 도구에 입력해 같은 코드가 나오는지 확인할 수 있습니다.
  • 서비스에 따라 SHA-1이 아닌 다른 해시 알고리즘(SHA-256·SHA-512)을 사용하는 경우가 있습니다. 생성된 코드가 실제 앱과 일치하지 않으면 알고리즘을 바꿔서 시도해 보세요.
  • 코드는 30초마다 자동으로 갱신되며, 진행 막대(프로그레스 바)로 남은 시간을 한눈에 확인할 수 있습니다. 전환 직전에 코드를 복사하면 인증 대상에 도달하기 전에 무효화될 수 있으니 주의하세요.
  • 이 도구는 브라우저 탭을 닫으면 시크릿이 완전히 폐기되며 어디에도 저장되지 않습니다. 백업용으로 사용하려면 별도로 안전한 곳(비밀번호 관리자 등)에 시크릿 자체를 보관해 주세요.

자주 묻는 질문

네. Base32 디코딩과 HMAC 계산은 모두 브라우저 내의 Web Crypto API에서 실행되며 서버로는 일절 전송되지 않습니다. 네트워크 통신을 살펴봐도 입력한 시크릿이 전송되지 않음을 확인할 수 있습니다.

해시 알고리즘 불일치(대부분 SHA-1이지만 일부 서비스는 SHA-256/SHA-512 사용)나 기기 시각이 어긋났을 가능성이 있습니다. 먼저 알고리즘을 바꿔서 시도해 보고, 그래도 일치하지 않으면 기기의 시각 설정(자동 시간 동기화)을 확인해 주세요.

일반적으로 TOTP가 더 안전하다고 여겨집니다. SMS는 전화번호 탈취(심 스와핑 사기)로 제3자에게 가로채일 위험이 있지만, TOTP는 기기 내에서 완결되므로 그런 유형의 공격을 받지 않습니다.

대부분의 서비스는 2FA 등록 시 "복구 코드"를 발급합니다. 시크릿 자체를 분실한 경우, 서비스 측의 계정 복구 절차(본인 확인)를 통해 2FA를 다시 설정해야 합니다.
ツールくん

여담이지만 ― 2단계 인증이 "6자리"로 정착한 이유

TOTP 사양(RFC 6238)을 제정한 OATH(Initiative for Open Authentication)는 HOTP(RFC 4226)의 동적 절단 알고리즘을 그대로 차용하고, 코드 자릿수는 구현 쪽에서 자유롭게 정할 수 있도록 설계했습니다. 그럼에도 6자리가 사실상 업계 표준이 된 것은 Google Authenticator가 2010년 초기 구현에서 이 자릿수를 채택했고, 이후 많은 서비스·라이브러리가 이를 따랐기 때문입니다.

6자리라는 길이는 절묘한 균형점이기도 합니다. 100만 가지(10의 6제곱) 조합이 짧은 30초의 유효 기간과 결합하면 무차별 대입 공격은 현실적으로 불가능해지는 한편, 사용자가 암기해서 직접 입력하기에는 이보다 길면 실용성이 떨어집니다. SMS 인증 코드 대부분도 마찬가지로 6자리를 채택하고 있는 것은 우연이 아니라, "짧은 시간에 쓰고 버리는 숫자 코드"라는 분야 전체가 수렴한 경험칙입니다.

TOTP의 전신인 HOTP(RFC 4226, 2005년)는 "카운터"를 사용하는 방식으로, 코드를 사용할 때마다 카운터를 하나씩 증가시켜야 했습니다. 그러나 사용자가 버튼 누르는 것을 잊거나 기기와 서버의 카운터가 어긋나는 등의 운영상 문제가 자주 발생했기 때문에, 2011년에 제정된 TOTP에서는 누구나 같은 값을 참조할 수 있는 "현재 시각"이라는 기준으로 대체되어 운영이 크게 단순화되었습니다.