hex를 Base64로 변환하는 방법
- 입력 · Hex에 hex를 붙여넣으세요. 공백, 줄 바꿈, 콜론, 하이픈,
0x나\x접두사는 건너뛰며 대소문자는 상관없습니다. - 입력하는 동안 출력 · Base64에 Base64가 나타납니다.
- 받는 쪽이 패딩 없는 Base64를 원하면 출력 아래의 패딩 (=) 을 해제하고, 줄 바꿈한 출력이 필요하면 줄 바꿈을 64(PEM)나 76(MIME)으로 설정하세요.
- 출력 복사를 누르거나, Base64 → Hex 전환으로 반대 방향에서 결과를 확인하세요. Base64를 Hex로는 같은 도구를 반대로 쓰는 것입니다.
해시 다이제스트: hex와 Base64
해시 함수는 원시 바이트를 돌려줍니다. sha256sum이나 md5sum 같은 명령줄 도구는 이 바이트를 hex로 출력하지만, 많은 프로토콜은 같은 다이제스트를 Base64로 기대합니다. 다음은 5바이트 hello의 다이제스트입니다.
| 해시 | Hex (sha256sum 등의 출력) | Base64 |
|---|---|---|
| MD5 | 5d41402abc4b2a76b9719d911017c592 | XUFAKrxLKna5cZ2REBfFkg== |
| SHA-1 | aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d | qvTGHdzF6KLavt4PO0gs2a6pQ00= |
| SHA-256 | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 | LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ= |
Base64 형식이 필요한 곳은 다음과 같습니다.
- Subresource Integrity.
<script>나<link>태그의integrity="sha384-…"에는 Base64 다이제스트가 들어갑니다. SRI 해시 생성기가 파일에서 속성 전체를 만들어 줍니다. Content-MD5헤더. RFC 1864는 이 값을 16바이트 MD5 다이제스트의 Base64로 정의하며, 이 헤더로 업로드를 검사하는 오브젝트 스토리지는 hex 형식을 거부합니다. MD5를 Base64로를 참고하세요.- API 요청의 서명과 HMAC은 대개 Base64로 보냅니다. HMAC Base64는 두 형식 모두로 계산합니다.
- 키와 시크릿:
openssl rand -hex 32가 출력한 32바이트 키는 많은 설정 파일이 기대하는 44문자 Base64 값이 됩니다.
직접 가진 텍스트나 파일의 SHA-256이라면 SHA-256 Base64가 hex 단계를 아예 건너뜁니다.
흔한 실수: hex 텍스트를 인코딩하기
echo -n 2cf24d…9824 | base64는 그럴듯하지만 틀린 결과를 냅니다. hex가 나타내는 32바이트 대신 hex의 ASCII 문자 64개를 인코딩해서, MmNmMjRk로 시작하는 88문자를 돌려줍니다. 이 값은 다시 hex 텍스트로 디코딩되기 때문에, 서명이나 무결성 검사가 실패할 때까지 아무 문제도 드러나지 않습니다. 먼저 hex를 디코딩하세요.
echo -n 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 | xxd -r -p | base64
# LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
printf hello | openssl dgst -sha256 -binary | base64
# same result, without going through hex at all
xxd -r -p는 일반 hex를 다시 바이트로 바꿉니다. Vim과 함께 설치되며, 최소 구성 시스템에서는 xxd 패키지를 설치하세요. OpenSSL에서는 -binary가 다이제스트를 hex가 아닌 바이트로 출력하게 합니다.
코드에서 hex를 Base64로
import base64
base64.b64encode(bytes.fromhex("5d41402abc4b2a76b9719d911017c592")).decode()
# 'XUFAKrxLKna5cZ2REBfFkg=='
Buffer.from("5d41402abc4b2a76b9719d911017c592", "hex").toString("base64");
// 'XUFAKrxLKna5cZ2REBfFkg=='
URL-safe와 패딩 없는 변형은 Python과 Node.js 페이지에서 다룹니다. 다이제스트를 URL이나 JWT에 넣는다면 결과를 Base64를 Base64URL로로 변환하세요.
변환이 실패할 때
- “hex 자릿수가 홀수입니다”. 바이트마다 두 자리가 필요한데, 복사하다 한 자리가 빠졌습니다. 입력의 양 끝을 확인하세요.
- “예상하지 못한 문자가 있습니다”.
sha256:라벨이나sha256sum이 다이제스트 뒤에 출력하는 파일 이름처럼 hex가 아닌 것이 입력에 있습니다. 지우세요. 표시를 누르면 그 위치로 이동합니다. - hex 덤프의 오프셋.
00000010: 4865 6c6c에서00000010은 데이터가 아니라 위치지만, 올바른 hex라서 함께 변환됩니다. 오프셋이 없는xxd -p출력을 쓰세요.
자주 묻는 질문
SHA-256 hex 해시를 Base64로 바꾸려면 어떻게 하나요?
hex 64자리를 입력란에 붙여넣으세요. 결과는 =로 끝나는 44문자입니다. 예를 들어 2cf24dba…9824는 LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=가 됩니다. 명령줄에서는 echo -n HEX | xxd -r -p | base64입니다.
Base64가 예상보다 두 배 긴 이유는 무엇인가요?
hex 문자열을 텍스트로 인코딩해서 hex 한 자리가 한 바이트가 되었습니다. SHA-256 다이제스트를 이렇게 인코딩하면 44문자가 아니라 88문자가 나옵니다. 먼저 hex를 바이트로 디코딩하세요. 이 변환기가 하는 일이 바로 그것입니다.
hex 문자열은 Base64 몇 문자가 되나요?
hex 두 자리가 1바이트이고, 3바이트마다 Base64 4문자가 되며 4의 배수로 올림됩니다. hex 32자리(MD5)는 24문자, 40자리(SHA-1)는 28문자, 64자리(SHA-256)는 44문자, 128자리(SHA-512)는 88문자가 됩니다.
UUID를 Base64로 바꿀 수 있나요?
네, 하이픈째 붙여넣으세요. 123e4567-e89b-12d3-a456-426614174000의 16바이트는 Ej5FZ+ibEtOkVkJmFBdAAA==가 되어 36문자가 24문자로 줄어듭니다.