2015-05-24 20 views
7

Tôi không thể tìm thấy câu trả lời cho điều này. Nếu tôi mã hóa một chuỗi với Base64 thì đầu ra được mã hóa có phải là duy nhất dựa trên chuỗi không? Tôi hỏi vì tôi muốn tạo một mã thông báo chứa thông tin người dùng nên tôi cần đảm bảo đầu ra sẽ là duy nhất tùy thuộc vào thông tin.Chuỗi mã hóa base64 có độc đáo không?

Ví dụ: nếu tôi mã hóa "UnqUserId: 987654321 Dấu thời gian: 01/02/03" thì đây có phải là duy nhất, cho dù userid nào tôi đặt vào đó sẽ không bao giờ là một va chạm?

+1

Base64 là * không * mã hóa. Nhưng có, các chuỗi đầu vào khác nhau sẽ luôn mã hóa thành các chuỗi mã hóa Base64 khác nhau và chuỗi đầu vào giống nhau sẽ luôn mã hóa thành cùng chuỗi được mã hóa Base64. Nó không phải là một băm mặc dù, do đó, những thay đổi nhỏ trong đầu vào sẽ chỉ dẫn đến những thay đổi nhỏ trong đầu ra. – Blorgbeard

Trả lời

8

Mã hóa không phải là mã hóa. Vì bạn có thể giải mã chuỗi, nó phải là duy nhất.

+9

Ví dụ về số lượt truy cập cho khiếu nại của bạn: Giá trị base64 'QzNWwc ==' và 'QzNWwQ ==' mã hóa cùng một giá trị nhị phân: 0x433356c1. Bạn có thể kiểm tra nó bằng lệnh sau: echo <> | base64 -d | xxd – user1861174

+0

Tôi nhận thấy cùng một vấn đề với khóa riêng RSA. Tôi trích xuất thành phần được mã hóa base64 từ một tệp tin là rsa_key.orig.Tiếp theo tôi thực hiện lệnh: echo '<< BASE64_encoded_key >>' | base64 -d | openssl rsa -inform der -out rsa_key.new. Tôi so sánh các tập tin và chúng khác nhau. Tệp mới có kích thước nhỏ hơn 24 byte so với tệp gốc. Sau đó tôi đã kiểm tra mô đun của mỗi tệp và chúng giống hệt nhau. – Bruce

17

Hai năm cuối, nhưng ở đây chúng tôi đi:

Câu trả lời ngắn gọn là có, giá trị nhị phân/hex độc đáo sẽ luôn mã hóa sang một base64 độc đáo mã hóa chuỗi.

NHƯNG, nhiều chuỗi mã hóa base64 có thể đại diện cho một giá trị nhị phân/hex đơn.

Điều này là do byte hex không được căn chỉnh với số 'base64'. Một byte hex đơn được biểu diễn bằng 8 bit trong khi một chữ số base64 đơn được biểu diễn bằng 6 bit. Do đó, bất kỳ giá trị hex nào không được liên kết 6 bit đều có thể có nhiều đại diện base64 (mặc dù bộ mã hóa base64 được triển khai chính xác nên mã hóa thành cùng một đại diện base64).

Ví dụ về sự lệch hướng này là giá trị hex '0x433356c1'. Giá trị này được biểu diễn bằng mã hóa 32 bit và base64 thành 'QzNWwQ =='. Tuy nhiên, giá trị 32 bit này không được căn chỉnh 6 bit. Vậy điều gì sẽ xảy ra? Các bộ mã hóa base64 đệm bốn bit không vào cuối biểu diễn nhị phân trong trường hợp này để tạo chuỗi 36 bit và do đó liên kết 6 bit.

Khi giải mã, bộ giải mã base64 hiện phải giải mã thành giá trị liên kết 8 bit. Nó cắt ngắn các bit đệm và giải mã 32 bit đầu tiên thành một giá trị hex. Ví dụ: 'QzNWwc ==' và 'QzNWwQ ==' là các chuỗi mã hóa base64 khác nhau, nhưng giải mã thành cùng một giá trị hex, 0x433356c1. Nếu chúng ta nhìn một cách cẩn thận, chúng tôi nhận thấy rằng 32 bit đầu tiên là như nhau cho cả hai chuỗi mã hóa:

'QzNWwc==': 
010000 110011 001101 010110 110000 011100 

'QzNWwQ==': 
010000 110011 001101 010110 110000 010000 

Sự khác biệt duy nhất là bốn bit cuối cùng, được bỏ qua. Xin lưu ý rằng không có bộ mã hóa base64 nên từng tạo 'QzNWwc ==' hoặc bất kỳ giá trị base64 nào khác cho 0x433356c1 ngoài 'QzNWwQ ==' vì byte đệm được thêm phải luôn là số 0.

Tóm lại, có thể giả định rằng giá trị nhị phân/hex duy nhất sẽ luôn mã hóa thành biểu diễn base64 duy nhất sử dụng bộ mã hóa base64 được triển khai chính xác. Một 'va chạm' sẽ chỉ xảy ra trong quá trình giải mã nếu chuỗi base64 được tạo ra mà không có byte đệm/sắp xếp zeroing.

+2

thankgod cho những người như u người chi tiết ngay cả trên "câu trả lời chấp nhận" câu hỏi !! ur kết luận đã đúng trên nhãn hiệu - nếu có lax trên một phần của mã hóa (padding), có wud được giải mã sai lầm :) – harshvchawla

+1

Đây phải là câu trả lời được chấp nhận. Tôi đang liên hệ với OP;) –

Các vấn đề liên quan