파일 업로드
  1. base64hub
  2. 기타 진법
  3. Base64 → Base32

TOTP 시크릿용 Base64를 Base32로 변환

Base64 시크릿을 붙여넣으면 같은 바이트를 RFC 4648 Base32로 받아 인증 앱이나 otpauth:// 링크에 쓸 수 있습니다. 패딩을 해제하면 결과를 secret= 파라미터에 그대로 넣을 수 있습니다.

무료 가입 없음, 제한 없음 로컬 업로드 없음 TOTP용 otpauth 링크용 패딩 없는 Base32 업데이트 2026. 10. 27.
입력 0바이트 0 B출력 0

브라우저에서 처리됩니다. 이 페이지는 데이터를 어디로도 보낼 수 없습니다 – 확인 방법

Base64를 Base32로 변환하는 방법

  1. 입력 · Base64에 Base64를 붙여넣으세요. URL-safe 문자(-, _), 누락된 패딩, 줄 바꿈이 있어도 됩니다.
  2. 출력 · Base32 (RFC 4648) 에서 결과를 확인하세요.
  3. otpauth:// 링크나 인증 앱에 쓸 경우 출력 아래의 패딩 (=) 을 해제하세요.
  4. 출력 복사를 클릭하세요. 방향 전환에서 Base32 (RFC 4648) → Base64를 고르면 반대로 변환하며, Base32를 Base64로 페이지도 같은 일을 합니다.

가운데에 있는 바이트는 바뀌지 않습니다. 도구 아래 바이트 카운터에서 볼 수 있듯이 20바이트 키를 넣으면 20바이트 키가 나옵니다.

예시

Base64Base32바이트
iEwO+V01Llzjb4MxBUtgEuCNW8o=RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K20
iEwO-V01Llzjb4MxBUtgEuCNW8oRBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K20, URL-safe이고 패딩 없는 입력
MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ20, RFC 6238 테스트 시크릿
SGVsbG8h3q2+7w==JBSWY3DPEHPK3PXP10

첫 행들의 두 문자열은 전혀 닮지 않았는데, 이는 정상입니다. Base64는 한 글자에 6비트, Base32는 5비트를 쓰므로 글자가 서로 맞아떨어지지 않습니다.

피해야 할 실수는 Base64 문자 자체를 텍스트로 인코딩하는 것입니다. iEwO+V01Llzjb4MxBUtgEuCNW8o=를 텍스트-Base32 인코더에 붙여넣으면 NFCXOTZLKYYDCTDM…이 나옵니다. 이는 그 28개 문자 자체를 인코딩한 올바른 Base32입니다. 여기서 나온 인증 코드는 서버와 절대 일치하지 않습니다.

Base64 시크릿으로 TOTP 설정하기

서버 코드는 공유 시크릿을 Base64로 저장하거나 다음과 같은 명령으로 생성하는 경우가 많습니다.

openssl rand -base64 20

인증 앱에 등록하려면 여기서 변환한 다음 키 URI를 만드세요.

otpauth://totp/Example:alice@example.com?secret=RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K&issuer=Example

algorithm, digits, period를 파라미터로 추가할 수 있습니다. 이들이 없으면 앱은 SHA-1, 6자리, 30초로 가정합니다. 로컬 QR 도구로 링크를 QR 코드로 만들거나, 사용자가 Base32 시크릿을 직접 입력하게 하세요. 시크릿은 서버가 HMAC에 넣는 바이트와 같으므로 서버를 바꾸지 않아도 코드가 일치합니다.

기존 시크릿이 아니라 새 시크릿이 필요하다면 랜덤 Base64 생성기(사용자 지정 프리셋)로 랜덤 20바이트를 Base64로 만든 뒤 여기서 변환하세요.

흔한 키 크기별 길이

키Base64Base32, 패딩 없음= 포함 Base32
10바이트 (80비트)161616
16바이트 (128비트)242632
20바이트 (160비트)283232
32바이트 (256비트)445256

10이나 20처럼 5의 배수인 바이트 수는 패딩이 전혀 없는 Base32가 됩니다.

Python으로 같은 변환하기

import base64

secret_b64 = "iEwO+V01Llzjb4MxBUtgEuCNW8o="
base64.b32encode(base64.b64decode(secret_b64)).decode().rstrip("=")
# 'RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K'

URL-safe 입력이라면 base64.urlsafe_b64decode를 쓰고, 패딩이 제거되었다면 먼저 =를 붙이세요. 자세한 내용은 Python에서 Base64에 있습니다.

자주 묻는 질문

인증 앱은 왜 Base64가 아니라 Base32를 쓰나요?

앱이 QR 코드에서 읽는 otpauth:// 키 URI 형식이 시크릿을 Base32로 정의하기 때문입니다. QR 코드를 스캔할 수 없을 때 손으로 입력할 수도 있어야 하는데, Base32에는 잘못 입력하기 쉬운 +, /, 대소문자 혼용이 없습니다.

Base32 시크릿에 = 패딩이 있어야 하나요?

otpauth:// 링크에서는 없어야 합니다. 키 URI 형식은 패딩을 생략하라고 정합니다. 패딩 (=) 을 해제하세요. 20바이트 시크릿은 32자이므로 원래 패딩이 필요 없습니다.

TOTP 시크릿은 얼마나 길어야 하나요?

RFC 4226은 최소 128비트를 요구하고 160비트를 권장합니다. 160비트는 20바이트로, Base64로는 28자, Base32로는 32자입니다.

시크릿을 Base32로 변환하면 보안상 위험한가요?

인코딩은 보호를 더하지도 빼지도 않습니다. 어느 형식이든 문자열을 가진 사람은 누구나 코드를 생성할 수 있습니다. 위험은 어디에 붙여넣느냐에 있습니다. 이 페이지는 브라우저 안에서 변환하며, Content Security Policy가 Cloudflare 조회수 집계 외의 네트워크 요청을 차단합니다.