2010-01-18 8 views
7

Nếu bạn có dữ liệu nhị phân mà bạn cần mã hóa, bạn sử dụng lược đồ mã hóa nào?Bạn sử dụng lược đồ mã hóa văn bản nào khi bạn có dữ liệu nhị phân mà bạn cần gửi qua kênh ascii?

tôi biết về:

  • Hex encoding. Rất đơn giản, nhưng khá tiết, mở rộng một byte thành hai.
  • Base 64. Phổ biến nhất, không quá chi tiết, mở rộng ba byte thành bốn.
  • Base 85. Không phổ biến, ít tiết hơn nữa, mở rộng bốn byte thành năm.

Có phương án mã hóa nào khác đang được sử dụng phổ biến không? Nếu vậy, những lợi thế và bất lợi là gì?

Chỉnh sửa: Điều này hữu ích, ví dụ: khi cố gắng lưu trữ dữ liệu tùy ý trong cookie. Cookie chỉ có thể lưu trữ văn bản, không phải dữ liệu tùy ý, vì vậy bạn cần phải chuyển đổi văn bản theo một cách nào đó, tốt nhất là bằng cách chuyển đổi nó trở lại. Hơn nữa, giả sử rằng bạn đang sử dụng một máy chủ không trạng thái để bạn không thể lưu trạng thái trên máy chủ và chỉ cần đặt một số nhận dạng vào cookie. Tất nhiên, nếu bạn làm điều này, bạn cũng sẽ cần một số cách để xác minh rằng những gì người dùng đang trả lại cho bạn là những gì bạn đã chuyển cho người dùng, ví dụ như một chữ ký. Ngoài ra, vì sự đồng thuận hiện tại là bạn nên sử dụng base64 vì nó phổ biến, tôi cũng sẽ chỉ ra rằng những gì tôi sử dụng ... Tôi chỉ tò mò nếu có ai sử dụng bất cứ thứ gì khác, và nếu có , tại sao.

Chỉnh sửa: Chỉ trong trường hợp ai đó tình cờ gặp vấn đề này, nếu bạn muốn sử dụng Base64 để lưu trữ dữ liệu trong cookie, bạn cần sử dụng a modified Base64 implementation. Xem this answer vì lý do tại sao.

+1

Ở nơi đầu tiên, tại sao bạn cần mã hóa nó? Bạn có bị ràng buộc vào kênh ASCII không? –

+3

Base64 giành chiến thắng vì nó phổ biến đến mức tôi không phải lo lắng về việc tung bộ mã hóa/giải mã của riêng mình. Tôi đã không chạy vào bất kỳ ứng dụng mà tôi đã lo lắng về việc tiết kiệm băng thông hoặc không gian tệp trong dữ liệu nhị phân được mã hóa. – jball

+1

@Paul, tôi sẽ chuyển thành @jball được đề xuất và chọn base64; nhưng, vì bạn đang gửi dữ liệu cho khách hàng và hy vọng rằng dữ liệu _same_ sẽ quay trở lại, bạn nên biết rằng có thể bị giả mạo ở phía khách hàng. –

Trả lời

13

Để mã hóa giá trị cookie, bạn cần phải cẩn thận. Xem này older answer:

Với Version 0 cookies, các giá trị nên không chứa khoảng trắng, dấu ngoặc, ngoặc, dấu bằng, dấu phẩy, dấu ngoặc kép, dấu gạch chéo, chất vấn nhãn hiệu, tại dấu hiệu, dấu hai chấm, và dấu chấm phẩy. Giá trị trống có thể không hoạt động theo cùng một cách trên tất cả các trình duyệt.

Mã hóa Base64 có thể tạo ra = các ký hiệu cho một số đầu vào nhất định và không được phép trong cookie (cookie phiên bản 0, được hỗ trợ rộng rãi nhất).Trong thực tế, tôi nghi ngờ các = thực sự sẽ làm việc tốt, nhưng có lẽ không.

Tôi khuyên bạn nên chắc chắn rằng mã nhị phân được mã hóa của bạn tương thích với cookie, sau đó mã hóa hex cơ bản là an toàn nhất (ví dụ: in java).

chỉnh sửa: Như @Paul đã chỉ ra một cách hữu ích, có một số modified version of Base 64 là "URL an toàn" (và, tôi cho rằng, "cookie an toàn"). Sử dụng một phiên bản sửa đổi của một thuật toán chuẩn thay vì làm loãng sự quyến rũ của nó, hãy nhớ bạn.

chỉnh sửa: @shoosh chỉ ra rằng = chỉ được sử dụng để biểu thị sự kết thúc của chuỗi base64, vì vậy bạn có thể cắt =, thiết lập các cookie, sau đó lắp lại = một lần nữa khi bạn cần phải giải mã nó.

+0

+1, cảnh báo đẹp về '=' ký tự, ty –

+1

Trong base64 '=' chỉ được sử dụng để đệm các byte cuối cùng. Bạn có thể đảm bảo rằng chúng không được phát ra hoặc chỉ thay đổi chúng thành một thứ gì đó khác (và sau đó quay lại) – shoosh

+1

Bạn có thể muốn xem xét cập nhật câu trả lời của mình để tham khảo http://en.wikipedia.org/wiki/Base64#URL% 5Fapplications - một phiên bản của Base4 đặc biệt để sử dụng trong môi trường HTTP. –

2

Ngày xửa ngày xưa, đã có UTF-7. Nó chính thức không được chấp nhận, nhưng nó vẫn hoạt động như một ACE (Mã hóa Tương thích ASCII). Hiện có IDN.

+0

+1 để chỉ ra IDN và UTF-7 dưới dạng các dạng thay thế làm cho unicode thành vận chuyển an toàn ASCII. –

1
  • uuencode là phổ biến là một số vòng tròn
  • HTML và mã hóa XML unicode sử dụng this syntax

Base64 là tiêu chuẩn de-facto. Sử dụng bất cứ điều gì khác là yêu cầu cho sự cố.

+0

+1 để chỉ ra mã uuencode. –

+0

'uuencoding' đưa tôi trở lại những ngày 1992 usenet :) Trên thực tế,' uuencoding' được thay thế phần lớn trong việc sử dụng usenet bởi 'yenc' (http://www.yenc.org/). – skaffman

+1

yenc. Blimey, điều đó sẽ đưa bạn trở lại ... sau đó bạn bắt đầu suy nghĩ về xmodem/ymodem và zmodem để lấy nó từ máy chủ shell đến máy chủ của bạn ;-) –

4

Base64 giành chiến thắng vì nó phổ biến đến mức tôi không phải lo lắng về việc lăn bộ mã hóa/giải mã của riêng mình. Tôi đã không chạy vào bất kỳ ứng dụng mà tôi đã lo lắng về việc tiết kiệm băng thông hoặc không gian tệp trong dữ liệu nhị phân được mã hóa.

+0

được thăng hạng, vì bạn là người đầu tiên nói điều này, trong phần nhận xét về câu hỏi. –

+0

+1, thông tin cho bạn đây, jball =) –