Chuyển đổi Hex sang Base64

Dán các byte thập lục phân để nhận cùng dữ liệu đó ở dạng Base64. Các dấu phân cách như dấu cách, dấu hai chấm và tiền tố 0x được tự động loại bỏ, nên bạn có thể dán nguyên mã băm và vân tay.

Chạy hoàn toàn trong trình duyệt của bạn. Không có gì được tải lên.

Cách sử dụng

  1. Dán chuỗi hex vào ô Đầu vào. Hex đã được chọn sẵn làm kiểu mã hóa nguồn, còn Base64 là kiểu mã hóa đích.
  2. Không cần chỉnh định dạng: dấu cách, xuống dòng, dấu hai chấm, dấu gạch nối và tiền tố 0x hoặc \x đều được bỏ qua.
  3. Đổi kiểu mã hóa đích sang Base64URL nếu giá trị sẽ được dùng trong URL, JWT hoặc JSON Web Key.
  4. Sao chép kết quả Base64.

Vì sao cần chuyển hex sang Base64

Hầu hết các công cụ băm in giá trị băm ở dạng hex, nhưng nhiều giao thức lại yêu cầu Base64, vốn ngắn hơn một phần ba. Các trường hợp điển hình:

  • Subresource Integrity. Thuộc tính integrity trên script và stylesheet chứa giá trị băm dạng Base64, chẳng hạn sha384- theo sau là 64 ký tự Base64.
  • Content Security Policy. Mã băm cho phép script nội tuyến được viết dưới dạng 'sha256-...' với giá trị Base64.
  • Tổng kiểm tra trong API HTTP. Header Content-MD5 và các header checksum của Amazon S3 chứa Base64 của giá trị băm nhị phân, chứ không phải chuỗi hex mà md5sum in ra.
  • Định danh gọn hơn. UUID dài 16 byte: 32 chữ số hex, nhưng chỉ 22 ký tự ở dạng Base64URL không có phần đệm.

Các định dạng hex được chấp nhận

Chữ số hex không phân biệt hoa thường. Trước khi giải mã, công cụ loại bỏ khoảng trắng, ký tự xuống dòng, dấu hai chấm, dấu chấm phẩy, dấu phẩy, dấu gạch nối và các tiền tố 0x, \x, % và &#x. Nhờ đó, công cụ xử lý được vân tay OpenSSL như AB:CD:EF, mảng C như 0x12, 0x34, chuỗi thoát như \x12\x34, byte mã hóa phần trăm và UUID có dấu gạch nối.

Sau khi làm sạch, đầu vào phải có số chữ số chẵn, hai chữ số cho mỗi byte. Số chữ số lẻ sẽ bị báo lỗi và thường có nghĩa là đã mất một số 0 ở đầu, ví dụ abc trong khi ý định là 0abc.

Mã hóa các byte, không phải văn bản hex

Một lỗi thường gặp là dán giá trị băm hex vào một bộ mã hóa văn bản sang Base64 thông thường. Cách đó mã hóa các ký tự 0-9a-f thay vì các byte mà chúng biểu diễn, và kết quả dài gấp đôi so với đúng: 88 ký tự cho một giá trị băm SHA-256 thay vì 44. Mọi nơi cần giá trị băm nhị phân, như thuộc tính SRI hay header checksum, đều sẽ từ chối giá trị đó. Công cụ này giải mã hex thành byte trước rồi mới mã hóa.

# Shell: giá trị băm hex sang Base64
printf '%s' "$HEX" | xxd -r -p | base64

# Giá trị SRI cho một tệp chỉ trong một bước
openssl dgst -sha384 -binary script.js | openssl base64 -A

# Python
base64.b64encode(bytes.fromhex(h)).decode()

// Node.js (âm thầm dừng lại ở ký tự không phải hex đầu tiên)
Buffer.from(h, 'hex').toString('base64')

Câu hỏi thường gặp

Vì sao chuỗi hex của tôi bị báo lỗi?

Hoặc đầu vào chứa một ký tự không phải chữ số hex, chẳng hạn chữ O thay cho số 0, hoặc số chữ số là số lẻ. Thông báo lỗi cho biết vị trí của ký tự không hợp lệ; nếu độ dài là số lẻ, hãy kiểm tra xem có thiếu số 0 ở đầu hay không.

Kết quả Base64 sẽ dài bao nhiêu?
Chia số chữ số hex cho 2 để có số byte, rồi tính 4 ký tự cho mỗi 3 byte, làm tròn lên. Một giá trị băm SHA-256 gồm 64 chữ số hex sẽ thành 44 ký tự Base64, trong đó có một dấu =.
Làm thế nào để tạo mã băm Subresource Integrity?
Tính giá trị băm SHA-384 của tệp, chuyển chuỗi hex đó tại đây, rồi viết integrity="sha384-..." với giá trị Base64. Với OpenSSL, bạn có thể làm việc này chỉ bằng một lệnh: openssl dgst -sha384 -binary file.js | openssl base64 -A.
Kết quả là Base64 chuẩn hay Base64 an toàn cho URL?
Base64 chuẩn với + và /, đúng như SRI, CSP và các header checksum HTTP yêu cầu. Hãy chọn Base64URL làm kiểu mã hóa đích khi bạn cần kết quả an toàn cho URL.