Công cụ dành cho nhà phát triển · Bộ mã hóa và giải mã Base64
Sơ lược về lịch sử Base64: từ uuencode và PEM đến bảng chữ cái ngày nay
· Lý lịch
base64 mã hóa
Bảng chữ cái của Base64 là bản ghi hóa thạch về các vấn đề giao thông những năm 1980. Bài đăng này nối tiếp từ uuencode thông qua Thư tăng cường quyền riêng tư đến MIME và RFC 4648, đồng thời giải thích từng lựa chọn thiết kế.
Tại sao bảng chữ cái không chỉ đơn giản là 0–63 theo một thứ tự rõ ràng nào đó — câu hỏi quay trở lại bốn thập kỷ trước
Base64 dường như không được hình thành đầy đủ như một tiêu chuẩn. Bảng chữ cái (A-Z, a-z, 0-9, +, /) là bản ghi hóa thạch của nhiều thập kỷ thử nghiệm mã hóa, mỗi thử nghiệm đều cố gắng giải quyết cùng một vấn đề: cách biểu diễn dữ liệu nhị phân dưới dạng văn bản tồn tại từ những năm 1970 và 1980, email, USENET và các công cụ Unix. Câu chuyện trải dài trên uuencode trên Unix, Thư tăng cường quyền riêng tư (RFC 1421) trong 1993, MIME (RFC 2045) trong 1996 và cuối cùng là RFC 4648 trong 2006 hợp nhất tất cả các biến thể.
Hiểu lịch sử này sẽ giải thích tại sao một số ký tự nhất định lại có trong bảng chữ cái và tại sao RFC lại để lại một số lựa chọn nhất định cho người triển khai. uuencode, viết tắt của mã hóa Unix-to-Unix, là công cụ đầu tiên giải quyết vấn đề truyền tải 7-bit trên Unix. Được tạo trong 1980, nó đã mã hóa từng 3 bytes (24 bits) thành 4 ký tự từ bảng chữ cái gồm 64 ký tự. Bảng chữ cái uuencode là ASCII 32 (dấu cách) đến ASCII 95 (dấu gạch dưới và dấu câu khác), được chọn vì những ký tự đó có thể in được trên bất kỳ thiết bị đầu cuối nào. Kho lưu trữ thể hiện bảng chữ cái hiện đang được triển khai, nhưng nó không chứa bằng chứng lưu trữ về ai đã chọn thứ tự đó hoặc tại sao mọi ký tự đều thắng. Do đó, tiêu đề được thu hẹp: bố cục hiện tại có thể được kiểm tra một cách chính xác, trong khi động cơ và ngày tháng yêu cầu các tài liệu lịch sử chính không được đưa vào đây.
Tại sao bảng chữ cái trông mang tính lịch sử — một ranh giới mà kho lưu trữ này không ghi lại
Tuy nhiên, khoảng trắng dưới dạng ký tự mã hóa có vấn đề: trình soạn thảo văn bản và hệ thống thư cắt bớt khoảng trắng ở cuối, làm hỏng đầu ra. Bảng chữ cái không lý tưởng nhưng nó hoạt động đủ tốt để chuyển tệp Unix sang Unix. Thư được tăng cường quyền riêng tư (RFC 1421, 1992) là nỗ lực ban đầu nhằm chuẩn hóa email được mã hóa. Nó bao gồm mã hóa Base64 của riêng nó (RFC 1341, cho MIME, RFC 1421 có trước về đặc điểm kỹ thuật nhưng bị chậm trễ trong việc áp dụng).
RFC 1421 Base64 đã sử dụng bảng chữ cái A-Z, a-z, 0-9, +, / (bảng chữ cái base64 hiện đại) và ngắt dòng ở 64 ký tự. Bảng chữ cái này tránh được khoảng trắng và các ký tự có vấn đề khác; mọi ký tự đều có thể in được một cách rõ ràng và không bị nhầm lẫn với mã kiểm soát hoặc các biến thể của bộ ký tự quốc gia. Độ dài dòng 64 ký tự phù hợp với chiều rộng của thiết bị đầu cuối giấy những năm 1980 và là một sự thỏa hiệp thực tế cho khả năng đọc. Uuencode thuộc về lịch sử xung quanh, tuy nhiên công cụ này không đọc cũng như không viết bảng chữ cái của nó. Việc coi nó là Base64 có thể hoán đổi cho nhau sẽ là một lỗi định dạng. Sự so sánh hữu ích ở đây chỉ giới hạn ở vấn đề chung là biểu diễn byte bằng các ký tự có thể in được.
Mã hóa trước đó dưới dạng ngữ cảnh, không phải bằng chứng triển khai
RFC 1421 không được sử dụng rộng rãi cho email mã hóa nhưng bảng chữ cái Base64 của nó vẫn tồn tại. MIME (Tiện ích mở rộng thư Internet đa năng, RFC 2045, 1996) đã sử dụng bảng chữ cái RFC 1421 Base64 nhưng đã thay đổi cách ngắt dòng từ 64 thành 76 ký tự. Lý do không phải là kỹ thuật mà là do lịch sử: các khối PEM (Thư nâng cao quyền riêng tư) có 64 ký tự và MIME đã chọn giới hạn hơi khác một chút để tránh nhầm lẫn với PEM trong phân tích cú pháp tự động.
MIME Base64 đã trở thành tiêu chuẩn cho tệp đính kèm email và là biến thể Base64 được sử dụng rộng rãi nhất hiện nay. RFC 2045 cũng xác định các giá trị Mã hóa chuyển nội dung khác (7bit, 8bit, có thể in được trích dẫn), cung cấp các tùy chọn hệ thống thư dựa trên loại nội dung. Lựa chọn bảng chữ cái sẽ tránh các ký tự khác nhau giữa ASCII và EBCDIC (mã hóa ký tự máy tính lớn IBM). Các ký tự A-Z, a-z, 0-9, + và / đều giống nhau ở cả hai bảng mã. Các khối kiểu PEM có thể nhận dạng được vì các nhãn bao quanh tài liệu được mã hóa được bọc. ToolAcre có thể xử lý phần nội dung Base64 được trích xuất sau khi xóa các nhãn đó. Nó không thể xác định đặc tả lưu trữ nào lần đầu tiên sử dụng một quy ước nhất định và bài viết này không giả vờ cây nguồn trả lời câu hỏi đó.
Áo giáp kiểu PEM là định dạng hiện đại có thể quan sát được mà không xác nhận câu chuyện gốc
Các ký tự như dấu ngoặc mở và dấu ngoặc đóng khác nhau giữa ASCII và EBCDIC nên chúng bị loại trừ. Điều này rất quan trọng vào những năm 1980 và đầu những năm 1990 khi việc truyền dữ liệu từ máy tính lớn sang Unix trở nên phổ biến. Bảng chữ cái cũng tránh dấu gạch chéo ngược, dấu ngoặc đơn và dấu ngoặc kép, có ý nghĩa đặc biệt trong chuỗi C và cú pháp shell. Chuỗi Base64 có thể được nhúng vào chương trình C hoặc tập lệnh shell mà không cần thoát hầu hết mọi ký tự.
RFC 3548 (2006) mã hóa Base64, base32 và base16 hợp nhất. Nó lưu ý rằng MIME, PEM và các ứng dụng khác đều sử dụng các khái niệm tương tự nhưng có quy tắc đệm và bảng chữ cái khác nhau. RFC 4648 (2006, được xuất bản cùng với RFC 3548) là tiêu chuẩn hiện tại và nó xác định năm họ mã hóa với các vectơ thử nghiệm cho mỗi họ. RFC cũng ghi lại lịch sử: tài liệu nào đã xác định loại mã hóa nào, nội dung nào đã thay đổi giữa các phiên bản và lý do đưa ra lựa chọn. Tùy chọn gói ký tự 76 của bộ mã hóa và tính năng xóa khoảng trắng của bộ giải mã giúp các mẫu có hình dạng MIME có thể kiểm tra được. Những thực tế triển khai đó không chứng minh được lịch sử đầy đủ của các tiêu chuẩn thư. Chúng cho thấy các hành vi tương thích hiện đại mà người đọc có thể tái tạo trực tiếp trong bảng điều khiển và các bài kiểm tra.
Gói kiểu MIME làm tùy chọn bộ mã hóa mà không cần xây dựng lại lịch sử tiêu chuẩn
Hầu hết các nhà phát triển chỉ gặp base64 và base64url trong RFC 4648; lịch sử được ghi lại cho những người cần triển khai các biến thể cũ hơn. Base64url (RFC 4648 phần 5) thay thế dấu cộng bằng dấu gạch ngang và dấu gạch chéo bằng dấu gạch dưới để tránh các ký tự dành riêng URL. Chuỗi base64 chứa + và / phải được mã hóa phần trăm trong URL (%2B và %2F); base64url tránh điều đó.
JWT (JSON Mã thông báo web) sử dụng base64url mà không cần đệm. Một số ứng dụng sử dụng base64url có phần đệm. RFC xác định cả hai biến thể; việc lựa chọn là tùy thuộc vào ứng dụng. Sự khác biệt này là lý do tại sao bộ giải mã JWT và bộ giải mã Base64 email có thể tạo ra đầu ra khác nhau cho cùng một chuỗi đầu vào (một chuỗi mong đợi base64url, chuỗi kia mong đợi base64). Bảng chữ cái, quy tắc đệm và ngắt dòng đều xuất hiện từ những hạn chế thực tế của hệ thống thực. Khả năng di chuyển tốt nhất được coi là một hạn chế đối với bảng chữ cái truyền tải hơn là tiểu sử đã được xác minh của từng ký hiệu. Các chữ cái và chữ số vẫn quen thuộc về mặt hình ảnh trên các hệ thống văn bản phổ biến, trong khi dấu câu cuối cùng sẽ khác ở chế độ URL-safe. Lý do lựa chọn lịch sử chính xác bị bỏ qua mà không có bằng chứng chính.
Tính di động như một hạn chế về thiết kế, không phải là một tài khoản đã được xác minh về các lựa chọn ký tự riêng lẻ
Bộ ký tự 64 đã được chọn để thể hiện qua các mã hóa; bảng chữ cái đã được sửa bởi RFC 1341 và 1421 và MIME; quy tắc đệm đến từ căn chỉnh 3 byte; và ngắt dòng đến từ giới hạn vận chuyển email. Việc triển khai bỏ qua lịch sử này có thể phát minh ra một mã hóa mới hoặc quên trường hợp đặc biệt. Các vectơ kiểm tra RFC 4648 (foobar tạo ra Zm9vYmFy) là cách để xác minh rằng việc triển khai tôn trọng tiêu chuẩn.
Các lựa chọn thay thế hiện đại như base85 (được sử dụng trong một số bối cảnh) vẫn tồn tại, nhưng base64 vẫn chiếm ưu thế vì động lực lịch sử và vì nó đủ tốt. Base64 không phải là mã hóa nhỏ gọn nhất (base85 và base91 dày đặc hơn), nhưng nó đơn giản, phổ biến và đã được chứng minh. Điều có thể khẳng định chắc chắn là cặp bảng chữ cái hiện tại: tiêu chuẩn kết thúc bằng dấu cộng và dấu gạch chéo; URL-safe thay thế dấu gạch nối và dấu gạch dưới. Đệm và gói là những lựa chọn riêng biệt. Các thử nghiệm bao gồm cả hai chế độ và phần đệm bị thiếu, cung cấp bằng chứng có thể tái tạo cho hành vi hiện tại thay vì trình tự thời gian được suy luận.
Kho lưu trữ chứng minh điều gì về tiêu chuẩn hiện tại và bảng chữ cái an toàn URL
Chi phí kích thước phần trăm 33 có thể chấp nhận được đối với hầu hết các mục đích sử dụng. Bảng chữ cái ổn định trong suốt quá trình triển khai. RFC đủ rõ ràng rằng những sai lệch thường là do cố ý (như thiếu sót phần đệm hoặc xử lý khoảng trắng) chứ không phải là sự hiểu lầm ngẫu nhiên.
Hiểu lịch sử Base64 sẽ giải thích tại sao nó trông như vậy. Các ký tự dấu cộng và dấu gạch chéo là những lựa chọn có chủ ý để tránh sự mơ hồ trong các bảng mã ký tự khác nhau. Quy tắc đệm đến từ nhóm 3 byte. Base85 và Ascii85 sử dụng các kích thước nhóm và bảng chữ cái khác nhau và nằm ngoài phạm vi triển khai. Đề cập đến họ không làm cho trang này trở thành một công cụ chuyển đổi cho họ. Việc so sánh mật độ hoặc lịch sử của chúng sẽ yêu cầu các nguồn và vectơ kiểm tra ngoài các tệp Base64 được xem xét cho mô-đun này.
Bài học rút ra: mỗi ký tự được chọn đều có lý do - cách bộ mã hóa & giải mã Base64 triển khai bảng chữ cái tiêu chuẩn dẫn đến kết quả là
Việc gói dòng đến từ email. Mỗi quyết định được đưa ra nhằm giải quyết một vấn đề thực sự với các hệ thống thực tế. Ngày nay, Base64 chủ yếu được sử dụng trong các ngữ cảnh (JWT, API, URI dữ liệu) trong đó lịch sử không quan trọng nhưng các quy tắc bảng chữ cái và phần đệm được kế thừa từ MIME và PEM đến RFC 4648.
Đọc RFC một lần và mã hóa chuỗi thử nghiệm trong công cụ mã hóa & giải mã Base64 kết nối tiêu chuẩn hiện tại với nguồn gốc lịch sử của nó. Bảng chữ cái tiêu chuẩn thu được sẽ hiển thị bất cứ khi nào đầu vào đạt đến chỉ số 62 hoặc 63. Sử dụng mẫu tạo ra các vị trí đó, chuyển đổi chế độ an toàn URL và chỉ so sánh dấu câu đã thay đổi. Thí nghiệm đó thể hiện định dạng ngày nay mà không dựa vào một câu chuyện không có căn cứ về phát minh của nó.