Tất cả bài viết

Base32: khác gì với Base64 và khi nào tiện hơn

Base32 giải quyết một vấn đề rất cụ thể: khi một chuỗi mã cần được đọc to, đọc qua điện thoại hoặc chép lại bằng tay, bảng chữ cái chỉ 32 ký tự ít gây nhầm lẫn hơn hẳn so với 64 ký tự của Base64.

Tình huống quen thuộc: thiết lập 2FA khi không quét được mã QR

Khi ứng dụng như Google Authenticator không quét được mã QR, nó sẽ hiện một "khóa thiết lập" để gõ tay — khóa này là Base32, không phải Base64. Chuẩn TOTP yêu cầu đúng định dạng này vì nó được thiết kế để chép lại chính xác, kể cả khi ai đó phải đọc từng ký tự qua điện thoại cho người khác ghi.

Bảng chữ cái được thiết kế để chống đọc nhầm

Base32 loại bỏ hoàn toàn 0, 1, 8, 9 cùng các chữ O, I, L — đúng những ký tự dễ bị nhầm nhất khi đọc to qua điện thoại hoặc nhìn trên màn hình mờ. Với người Việt quen gõ dấu trên bàn phím Telex hay VNI, việc phân biệt chữ O và số 0 khi đọc miệng vẫn dễ gây lẫn lộn; Base32 loại bỏ hẳn sự mơ hồ này ngay từ bảng chữ cái.

Nơi Base32 xuất hiện trong thực tế

  • Địa chỉ .onion của mạng Tor — phần tên miền phụ 56 ký tự chính là khóa công khai Ed25519 được mã hóa Base32.
  • Nhãn DNS và tên miền phụ, vốn không phân biệt hoa thường theo đúng đặc tả giao thức.
  • Mã giới thiệu hoặc mã giảm giá in trên hóa đơn giấy, mà khách hàng phải gõ lại thủ công trên một trang web.

Cái giá của sự dễ đọc: chuỗi dài hơn

Bảng chữ cái nhỏ hơn nghĩa là mỗi byte cần nhiều ký tự hơn để biểu diễn — kết quả dài hơn khoảng 60% so với Base64. Với một khóa bí mật 20 byte, chênh lệch này không đáng kể; nhưng với một tệp vài megabyte, dùng Base32 hoàn toàn không thực tế.

Base32 và Base32hex không thể thay thế cho nhau

RFC 4648 còn định nghĩa Base32hex, dùng bảng chữ cái 0–9A–V thay vì A–Z2–7, giữ nguyên thứ tự sắp xếp của chuỗi giống hệt thứ tự của các byte gốc — tính chất quan trọng với một số cơ sở dữ liệu. Một chuỗi mã hóa bằng biến thể này sẽ không giải mã đúng bằng biến thể kia, nên cần xác định rõ hệ thống đang dùng biến thể nào trước khi giải mã.

Dùng thử công cụ