Tiếng Việt

Công cụ dành cho nhà phát triển · Bộ mã hóa và giải mã Base64

Tại sao Base64 được dán không giải mã được: ngắt dòng, dòng mới và dấu ngoặc kép thông minh

· Tại sao nó quan trọng

base64 mã hóa

Chuỗi Base64 trước và sau khi loại bỏ ngắt dòng, cắt bớt khoảng trắng và sửa chữa phần bị cắt bớt
Hình minh họa vector ToolAcre gốc

Base64 hiếm khi bị hỏng trong quá trình vận chuyển; nó bị hỏng trong clipboard. Bài đăng này liệt kê các lỗi sao chép-dán tạo ra các lỗi về ký tự và độ dài không hợp lệ cũng như cách phát hiện từng lỗi một cách nhanh chóng.

Khóa hoạt động trong thiết bị đầu cuối và không hoạt động trong trình duyệt - một ký tự vô hình và tìm kiếm kéo dài hai giờ

Một kỹ sư đã sao chép khóa API từ thiết bị đầu cuối để kiểm tra khóa đó trong tập lệnh. Khóa hoạt động tốt trong thiết bị đầu cuối nhưng không thành công với ký tự không hợp lệ khi dán vào công cụ trình duyệt. Hai giờ sau, sau khi tìm kiếm mã, cấu hình và tài liệu, họ phát hiện ra một ký tự vô hình. Một dòng mới ở cuối khóa, được thêm bằng tiếng vang hoặc được sao chép từ dòng nhắc đầu cuối, đã trở thành một ký tự phụ làm hỏng bộ giải mã Base64. Chìa khóa đã đúng; clipboard thì không. Dữ liệu Base64 đáng tin cậy khi được truyền điện tử, được kiểm tra và xác minh. Nó hầu như chỉ bị hỏng trong quá trình sao chép và dán thủ công.

Gói dòng trong thiết bị đầu cuối, theo dõi dòng mới từ đầu ra lệnh, thay thế trích dẫn thông minh trong trình soạn thảo văn bản đa dạng thức và các ký tự Unicode ẩn khỏi quá trình sao chép-dán giữa các ứng dụng khác nhau đều gây ra lỗi có vẻ như Base64 bị hỏng khi vấn đề thực tế nằm ở cách nó được sao chép. Bài đăng này liệt kê các lỗi phổ biến nhất và chỉ ra cách phát hiện và khắc phục từng lỗi một cách nhanh chóng. Bảng chữ cái Base64 bao gồm chữ hoa và chữ thường, chữ số, dấu cộng, dấu gạch chéo và ký tự đệm (dấu bằng). RFC 4648 là cụ thể: chuỗi Base64 tiêu chuẩn chỉ chứa các ký tự đó cộng với khoảng trắng tùy chọn nếu các dòng được ngắt dòng.

Ngắt dòng từ thiết bị đầu cuối, ứng dụng email và định dạng PEM — tại sao việc ngắt cột 76 lại phù hợp với một số bộ giải mã nhưng lại gây nguy hiểm cho một số bộ giải mã khác

Nhiều công cụ chấp nhận những sai lệch: chúng chấp nhận các biến thể an toàn URL bằng cách sử dụng dấu gạch ngang và dấu gạch dưới thay vì dấu cộng và dấu gạch chéo hoặc chúng bỏ qua dòng mới. Bộ giải mã nghiêm ngặt tuân theo RFC sẽ từ chối mọi thứ nằm ngoài bộ ký tự dự kiến ​​và không thành công với lỗi ký tự không hợp lệ. Thông báo lỗi thường nêu tên ký tự vi phạm hoặc ghi chú rằng chuỗi đó hoàn toàn không thể giải mã được. Khi dán Base64 từ email, thiết bị đầu cuối, lịch sử trò chuyện hoặc tài liệu được định dạng, các ký tự ẩn hoặc thay thế ký tự thường trượt vào và khiến quá trình giải mã không thành công. Bản thân dữ liệu vẫn ổn; việc chuyển clipboard đã làm hỏng nó.

Gói dòng là nguyên nhân phổ biến nhất gây ra lỗi Base64 khi dán và cũng là nguyên nhân dễ sửa nhất. Công cụ đầu cuối bao bọc đầu ra ở 76 ký tự trên mỗi dòng hoặc đôi khi 80, chèn dòng mới và tiếp tục trên dòng tiếp theo. Nhiều bộ mã hóa, bao gồm một số thư viện mã hóa Base64, bao bọc đầu ra của chúng ở cùng ranh giới 76 ký tự để tương thích với email MIME. Khi bạn sao chép chuỗi Base64 được gói từ thiết bị đầu cuối, các dòng mới sẽ xuất hiện.

Theo dõi dòng mới từ công cụ echo và clipboard - byte bổ sung sẽ trở thành ký tự phụ

Một số bộ giải mã tự động chấp nhận và bỏ qua dòng mới. Những người khác từ chối chúng như những ký tự không hợp lệ. Cách khắc phục là xóa tất cả các dòng mới và khoảng trắng. Nếu chuỗi Base64 được bao bọc trên nhiều dòng trong thiết bị đầu cuối, hãy chọn tất cả các dòng, sao chép chúng vào trình chỉnh sửa và xóa tất cả các dòng mới.

Sao chép chuỗi một dòng kết quả và dán nó vào bộ giải mã. Đây là điều đầu tiên cần thử khi dán không thành công. Việc theo dõi các dòng mới từ các tiện ích echo và clipboard là một thủ phạm phổ biến khác. Lệnh echo $API_KEY in khóa theo sau là dòng mới, đây là hành vi tiêu chuẩn của lệnh. Nếu bạn sao chép trực tiếp kết quả đó thì dòng mới sẽ được đưa vào bản sao. Một số thiết bị đầu cuối thêm dòng mới bổ sung khi bạn sao chép và một số trình quản lý bảng nhớ tạm giữ nguyên hoặc sao chép dòng mới. Triệu chứng này giống như ngắt dòng: một ký tự phụ ở cuối chuỗi không thuộc Base64.

Dấu ngoặc kép thông minh, dấu cách không ngắt và ký tự có độ rộng bằng 0 — cách người soạn thảo văn bản đa dạng thức viết lại văn bản thuần túy

Cách khắc phục cũng đơn giản không kém: cắt bớt các đầu của chuỗi đã dán trong trình chỉnh sửa của bạn trước khi thử giải mã. Xóa khoảng trắng ở đầu và cuối cũng như bất kỳ ký tự nào trông giống dòng mới. Nếu chuỗi đủ ngắn, bạn có thể gõ lại theo cách thủ công, nhưng đối với các phím dài, việc cắt xén thủ công cẩn thận sẽ nhanh hơn. Dấu ngoặc kép thông minh, dấu cách không ngắt và các thay thế Unicode khác là những cái bẫy tinh vi. Các trình soạn thảo văn bản đa dạng thức như Word tự động chuyển đổi dấu ngoặc kép thẳng thành dấu ngoặc nhọn, chuyển đổi ba dấu gạch nối thành dấu gạch ngang và chuyển đổi các chuỗi khoảng trắng nhất định thành dấu cách không ngắt. Nếu ai đó dán chuỗi Base64 vào tài liệu và sau đó bạn sao chép chuỗi đó từ tài liệu được định dạng vào một công cụ thì những thay thế đó sẽ xuất hiện.

Dấu ngoặc kép thẳng (") trở thành cặp cong trái và phải, cả hai đều không hợp lệ Base64. Dấu cách không ngắt (U+00A0) trông giống với khoảng trắng thông thường nhưng có mã ký tự khác và không được tất cả các trình phân tích cú pháp nhận dạng là khoảng trắng. Giải pháp là trước tiên dán vào trình soạn thảo văn bản thuần túy, thao tác này sẽ loại bỏ mọi định dạng. Nếu bạn dán từ tài liệu Word hoặc cuộc trò chuyện được định dạng, trước tiên hãy dán vào trình soạn thảo văn bản thuần túy hoặc vùng văn bản HTML rồi kiểm tra số lẻ Sau đó sao chép từ phiên bản văn bản thuần túy để sử dụng trong công cụ của bạn.

Cắt bớt và mất phần đệm - kiểm tra độ dài-modulo-4 cho bạn biết các ký tự bị thiếu

Việc cắt bớt xảy ra khi một chuỗi bị cắt trong quá trình sao chép hoặc dán. Chuỗi Base64 rất dài có thể vượt quá giới hạn bảng nhớ tạm trên một số hệ thống hoặc không sao chép được do lỗi ứng dụng. Kết quả là một chuỗi ngắn hơn nhưng không đầy đủ. Chuỗi Base64 phải có độ dài là bội số của 4 sau khi áp dụng phần đệm. Nếu độ dài không phải là bội số của 4 thì nó bị cắt ngắn hoặc bị hỏng. Thông báo lỗi thường lưu ý rằng độ dài chuỗi không hợp lệ hoặc thiếu một ký tự. Việc sửa lỗi yêu cầu biết những gì đã được sao chép ban đầu.

Nếu có thể kiểm tra lại nguồn thì hãy copy lại cẩn thận. Nếu không, việc cắt bớt sẽ không thể phục hồi được. Mất phần đệm là một vấn đề liên quan: Phần đệm Base64 có dấu bằng đôi khi bị loại bỏ để tiết kiệm một vài byte. Một số ứng dụng bỏ qua phần đệm và một số yêu cầu nó. Nếu một chuỗi ban đầu được đệm và phần đệm bị mất, hãy thêm nó trở lại. Chuỗi Base64 phải có 0, 1 hoặc 2 ở cuối các dấu bằng sao cho tổng chiều dài là bội số của bốn. Nếu nó không có và độ dài không phải là bội số của 4 thì phần đệm có thể đã bị mất.

Ví dụ thực hiện được: sửa một chuỗi bị ngắt và bị cắt bớt — làm sạch chuỗi đó từng bước cho đến khi giải mã được

Một ví dụ hoạt động cho thấy từng bước sửa chữa này. Giả sử khóa API đã sao chép xuất hiện dưới dạng sau trong trình chỉnh sửa của bạn: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0Cg==. Bắt đầu bằng cách xác định các vấn đề. Dấu Cg== ở cuối là số lẻ; Cg là base64 cho ký tự dòng mới (hex 0A) và phần bổ sung == gợi ý nội dung nào đó đã được thêm vào. Xóa dấu Cg== và chỉ thử VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0. Điều đó vẫn không đúng; độ dài là 37 ký tự, không phải bội số của bốn. Cắt lại: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0 (35 ký tự, vẫn sai). Kiểm tra nguồn gốc. Chuỗi đúng là VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0 (32 ký tự) với phần đệm thích hợp: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0. Thêm nó: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0=.

Kiểm tra trong bộ giải mã. Việc giải mã này thực sự không phải là một bí mật. Ở mỗi bước, hãy sử dụng bộ mã hóa & giải mã Base64 để kiểm tra chuỗi hiện tại, khắc phục sự cố đã xác định và kiểm tra lại cho đến khi giải mã được. Bộ giải mã không thể khắc phục được lỗi bên trong các byte Base64. Nếu các byte thực sự bị hỏng trong quá trình truyền, truyền hoặc lưu trữ thì bản thân Base64 không thể phát hiện ra nó. RFC chỉ định các ký tự hợp lệ; bất kỳ ký tự nào bên ngoài tập hợp đó là công việc giải mã cần bắt. Bất kỳ lỗi byte nào, chẳng hạn như 0 trở thành 1 ở giữa ký tự Base64, sẽ tạo ra một mã ký tự hoàn toàn khác và chỉ Base64 mới không thể phát hiện được.

Điều này không bao gồm - lỗi bên trong các byte được mã hóa mà bản thân Base64 không thể phát hiện được

Tổng kiểm tra hoặc chữ ký số được sử dụng để phát hiện loại lỗi này và chúng phải được tính toán trên dữ liệu nhị phân gốc trước khi mã hóa Base64. Nếu bạn giải mã chuỗi Base64 và kết quả là rác hoặc khác với những gì bạn mong đợi thì lỗi đã xảy ra trước khi mã hóa hoặc trong khi truyền chứ không phải trong bước sao chép-dán. Điều này rất hiếm trong thực tế. Hầu hết các lỗi đều là vấn đề sao chép-dán như những vấn đề trên. Một cách tiếp cận có hệ thống để gỡ lỗi lỗi sao chép-dán Base64 là kiểm tra từng vấn đề tiềm ẩn theo thứ tự. Đầu tiên, loại bỏ tất cả khoảng trắng và dòng mới. Sau đó cắt bớt khoảng trắng ở đầu và cuối cũng như bất kỳ ký tự nào bị lạc.

Sau đó kiểm tra độ dài modulo 4 và thêm phần đệm nếu cần. Dán từng phiên bản vào bộ mã hóa & giải mã Base64 và xem nó có giải mã được không. Nếu việc kiểm tra độ dài không thành công, hãy hỏi xem chuỗi có bị cắt ngắn hay không và truy xuất nó từ nguồn ban đầu. Nếu kiểm tra bảng chữ cái không thành công và bạn thấy các ký tự bất thường, hãy tìm dấu ngoặc kép thông minh hoặc từ thay thế Unicode và thay thế chúng bằng ASCII tương đương. Sử dụng công cụ trực tuyến hiển thị cho bạn các ký tự không hợp lệ theo tên để bạn có thể xác định và xóa chúng. Bộ mã hóa và giải mã Base64 thực hiện việc này cho mọi ký tự không hợp lệ, cho biết chính xác ký tự nào không có trong bảng chữ cái.

Bài học rút ra: kiểm tra độ dài và bảng chữ cái trước khi đổ lỗi cho dữ liệu - cách bộ mã hóa và giải mã Base64 cung cấp cho bạn một địa điểm cục bộ nhanh chóng để kiểm tra từng lần sửa chữa

Sử dụng phản hồi đó để sửa từng ký tự và tiếp tục cho đến khi chuỗi giải mã. Phòng ngừa dễ hơn gỡ lỗi. Khi bạn biết mình sẽ cần lại chuỗi Base64, hãy sao chép chuỗi đó theo cách giữ nguyên định dạng. Không dán nó vào một tài liệu văn bản có định dạng. Lưu trữ nó trong một tệp văn bản thuần túy hoặc một vùng văn bản được chỉ định không có sự thay thế. Nếu ai đó gửi cho bạn chuỗi Base64 dưới dạng tin nhắn được định dạng, hãy yêu cầu họ gửi lại chuỗi đó ở dạng mã hoặc văn bản thuần túy. Nếu bạn phải sao chép từ một nguồn được định dạng, trước tiên hãy dán vào trình soạn thảo văn bản thuần túy và xác minh chuỗi trước khi sử dụng.

Kiểm tra chuỗi trong bộ mã hóa và giải mã Base64 ngay khi bạn có nó, trước khi bạn dựa vào nó. Nếu thất bại, bạn có thể yêu cầu một bản sao mới trong khi nguồn vẫn có thể truy cập được. Nếu bạn đợi cho đến khi chuỗi cũ hoặc nguồn không còn thì việc sửa lỗi cắt ngắn hoặc hỏng sẽ trở nên bất khả thi. Bộ mã hóa và giải mã Base64 cung cấp cho bạn một địa điểm cục bộ nhanh chóng để kiểm tra bất kỳ chuỗi nào trước khi cam kết sử dụng nó. Kiểm tra sớm và kiểm tra thường xuyên để phát hiện lỗi sao chép-dán ngay lập tức.