TOTP 생성·검증기
브라우저 처리Base32 비밀키나 otpauth:// 주소로 2단계 인증 앱과 같은 TOTP 코드(RFC 6238)를 만들고, 다음 코드와 남은 시간을 보여 줍니다. SHA-1·256·512, 6~8자리, code=로 입력한 코드 검증도 됩니다.
- 파일·이미지·문서 처리 도구는 브라우저 안에서 처리되더라도 원본에 개인정보나 민감 정보가 포함될 수 있습니다. 공유·제출 전 원본과 결과를 한 번 더 확인하세요.
구글 OTP, Microsoft Authenticator 같은 2단계 인증 앱은 비밀키와 현재 시각으로 30초마다 바뀌는 6자리 코드를 만듭니다. 이 도구는 같은 RFC 6238 계산으로 코드를 만들어, 서버에 2단계 인증을 구현하거나 기기 시간이 맞는지 확인할 때 쓸 수 있게 합니다.
지정 시각(59초)의 코드: 94287082 다음 코드: 37359152 SHA-1 · 8자리 · 30초 · 카운터 1
TOTP 생성·검증기 사용 가이드
구글 OTP, Microsoft Authenticator 같은 2단계 인증 앱은 비밀키와 현재 시각으로 30초마다 바뀌는 6자리 코드를 만듭니다. 이 도구는 같은 RFC 6238 계산으로 코드를 만들어, 서버에 2단계 인증을 구현하거나 기기 시간이 맞는지 확인할 때 쓸 수 있게 합니다.
비밀키는 JBSWY3DPEHPK3PXP 같은 Base32 문자열을 넣거나, QR 코드에 담긴 otpauth://totp/… 주소를 통째로 붙여 넣으면 계정 이름, 자리수, 주기, 알고리즘을 주소에서 읽습니다. 옵션 칸에서 period(주기), digits(6~8자리), algorithm(SHA-1·SHA-256·SHA-512)을 바꿀 수 있습니다.
time=59처럼 유닉스 시각을 넣으면 그 시점의 코드를 계산하고, code=123456을 넣으면 현재 코드와 앞뒤 한 구간(시계 오차 허용 범위)에 맞는지 알려 줍니다. RFC 6238 부록의 공식 예제값과 같은 결과가 나오도록 확인했습니다.
사용 방법
- '입력 A' 칸에 Base32 비밀키 또는 otpauth:// 주소를 넣습니다.
- '입력 B' 칸에 필요하면 period=30, digits=6, algorithm=SHA-1, time=, code= 옵션을 한 줄에 하나씩 적습니다.
- '실행'을 누르면 현재 코드, 남은 시간, 다음 코드가 나옵니다.
예시: RFC 6238 예제값으로 확인
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ --- digits=8 time=59
지정 시각(59초)의 코드: 94287082 다음 코드: 37359152 SHA-1 · 8자리 · 30초 · 카운터 1
RFC 6238 부록 B의 SHA-1 예제(59초 → 94287082)와 같은 값입니다.
이럴 때 쓰면 좋아요
- 웹 서비스에 2단계 인증(TOTP)을 구현하면서 서버 계산이 맞는지 확인할 때
- OTP 앱의 코드가 계속 틀릴 때 기기 시계가 어긋났는지 확인할 때
- otpauth:// 주소에 담긴 설정(자리수·주기·알고리즘)을 확인할 때
- 테스트 계정의 OTP 코드를 개발 중에 바로 받아야 할 때
문제가 생겼을 때
컴퓨터와 휴대전화의 시각이 30초 이상 어긋나면 코드가 달라집니다. 두 기기 모두 시간 자동 설정을 켜고, digits·period·algorithm이 같은지 확인하세요.
비밀키를 복사하다 끝부분이 잘렸을 가능성이 큽니다. 서비스에서 보여 준 키 전체(보통 16~32자)를 다시 복사하세요.
활용 팁
- 실제 계정의 비밀키는 비밀번호와 같습니다. 개인 기기에서만 사용하고 화면을 공유하지 마세요. 계산은 브라우저 안에서만 이루어집니다.
- 서버에서 코드를 검증할 때는 시계 오차를 고려해 앞뒤 한 구간(±30초)까지 허용하는 것이 일반적입니다. code= 옵션이 같은 방식으로 확인합니다.
자주 묻는 질문
이 도구는 시간 기반 TOTP만 계산합니다. 다만 time=값을 period로 나눈 카운터를 쓰므로, 카운터 n의 HOTP 값은 time=n×30으로 구할 수 있습니다.
이미지는 읽지 않습니다. QR 코드 리더로 otpauth:// 주소를 얻은 뒤 그 주소를 붙여 넣으세요.
아니요. 비밀키와 코드는 브라우저 메모리에서만 계산되고 저장하거나 전송하지 않습니다.