사용 방법
- 16진수 문자열을 입력란에 붙여넣습니다. ‘원본 형식’은 16진수, ‘대상 형식’은 Base64로 미리 선택되어 있습니다.
- 형식은 신경 쓰지 않아도 됩니다. 공백, 줄 바꿈, 콜론, 하이픈과 0x 또는 \x 접두사는 무시됩니다.
- 값을 URL, JWT, JSON Web Key에 넣을 예정이라면 ‘대상 형식’을 Base64URL로 바꾸십시오.
- Base64 결과를 복사합니다.
16진수를 Base64로 변환하는 이유
대부분의 해시 도구는 다이제스트를 16진수로 출력하지만, 많은 프로토콜은 길이가 3분의 1 짧은 Base64를 요구합니다. 대표적인 경우는 다음과 같습니다.
- 하위 리소스 무결성(SRI). 스크립트와 스타일시트의
integrity속성에는 Base64 다이제스트가 들어갑니다. 예를 들어sha384-뒤에 Base64 문자 64개가 이어지는 형태입니다. - 콘텐츠 보안 정책(CSP). 인라인 스크립트를 허용하는 해시는 Base64 값을 넣어
'sha256-...'형태로 작성합니다. - HTTP API의 체크섬.
Content-MD5헤더와 Amazon S3 체크섬 헤더에는md5sum이 출력하는 16진수 문자열이 아니라 바이너리 다이제스트의 Base64가 들어갑니다. - 짧은 식별자. UUID는 16바이트로, 16진수로는 32자리이지만 패딩 없는 Base64URL로는 22자에 불과합니다.
지원하는 16진수 형식
16진수 숫자는 대소문자를 구분하지 않습니다. 변환기는 디코딩하기 전에 공백 문자, 줄 바꿈, 콜론, 세미콜론, 쉼표, 하이픈과 0x, \x, %, &#x 접두사를 제거합니다. 따라서 AB:CD:EF 같은 OpenSSL 지문, 0x12, 0x34 같은 C 배열, \x12\x34 같은 이스케이프 문자열, 퍼센트 인코딩된 바이트, 하이픈이 들어간 UUID를 모두 그대로 사용할 수 있습니다.
정리한 후의 입력은 바이트당 두 자리씩, 짝수 개의 숫자로 이루어져야 합니다. 숫자 개수가 홀수이면 오류로 표시되며, 이는 대개 앞자리 0이 빠졌다는 뜻입니다. 예를 들어 0abc를 의도했는데 abc로 쓴 경우입니다.
16진수 텍스트가 아닌 바이트를 인코딩하기
흔히 하는 실수는 16진수 다이제스트를 일반적인 텍스트용 Base64 인코더에 붙여넣는 것입니다. 그러면 16진수가 나타내는 바이트가 아니라 0-9a-f 문자 자체가 인코딩되어 결과가 올바른 값보다 두 배 길어집니다. SHA-256 다이제스트라면 44자가 아니라 88자가 됩니다. SRI 속성이나 체크섬 헤더처럼 바이너리 다이제스트를 요구하는 곳에서는 이런 값을 거부합니다. 이 변환기는 먼저 16진수를 바이트로 디코딩합니다.
# 셸: 16진수 다이제스트를 Base64로
printf '%s' "$HEX" | xxd -r -p | base64
# 파일의 SRI 값을 한 번에 생성
openssl dgst -sha384 -binary script.js | openssl base64 -A
# Python
base64.b64encode(bytes.fromhex(h)).decode()
// Node.js(16진수가 아닌 첫 문자에서 오류 없이 멈춤)
Buffer.from(h, 'hex').toString('base64')
자주 묻는 질문
16진수 문자열에서 오류가 나는 이유는 무엇입니까?
입력에 16진수가 아닌 문자(예: 숫자 0 대신 영문자 O)가 들어 있거나 숫자 개수가 홀수이기 때문입니다. 오류 메시지에 잘못된 문자의 위치가 표시되며, 길이가 홀수라면 앞자리 0이 빠지지 않았는지 확인하십시오.
Base64 출력은 얼마나 깁니까?
= 기호 하나를 포함해 Base64 44자가 됩니다.하위 리소스 무결성(SRI) 해시는 어떻게 만듭니까?
integrity="sha384-..."로 작성합니다. OpenSSL을 사용하면 openssl dgst -sha384 -binary file.js | openssl base64 -A 명령 하나로 처리할 수 있습니다.출력은 표준 Base64입니까, URL 안전 Base64입니까?
+와 /를 사용하는 표준 Base64입니다. URL 안전 출력이 필요하면 대상 형식으로 Base64URL을 선택하십시오.