Tại sao có sự không nhất quán trong đầu ra base64?


12

Tôi đang sử dụng cơ sở dữ liệu đồ thị neo4j dựa trên java trên Ubuntu 15.04.

Tiêu đề xác thực HTTP neo4j sử dụng mã hóa base64 của 'username: password' (không bao gồm dấu ngoặc kép). Sử dụng wireshark tôi có thể thấy mã base64 được tạo bởi neo4j.

Tuy nhiên, nếu tôi sử dụng ubfox coreutils base64 để mã hóa cùng một chuỗi, tôi nhận được một mã hóa hơi khác. Mã hóa này không được chấp nhận bởi neo4j.

Cả hai mã hóa đều giải mã đúng tên người dùng: chuỗi mật khẩu

Thí dụ

tên người dùng = neo4jvà mật khẩu =@N

Neo4j cung cấp giá trị được mã hóa neo4j:@Ntheo như bmVvNGo6QE4=giải mã neo4j:@Nnhư mong đợi

$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N

Ubuntu coreutils base64trả về giá trị được mã hóa neo4j:@Nlà as bmVvNGo6QE4K(khác với ký tự cuối cùng) nhưng vẫn giải mã chính xác;

$ echo 'neo4j:@N' | base64
bmVvNGo6QE4K
$ echo 'bmVvNGo6QE4K' | base64 --decode
neo4j:@N

Tại sao lại thế này? Tôi cần làm gì để có được mã hóa nhất quán?


3
Lưu ý rằng =trong Base64 bình thường là phần đệm (và chỉ hợp lệ ở cuối). Thực tế là một chuỗi được mã hóa có phần đệm và chuỗi kia không (hay nói chung hơn là hai chuỗi có số lượng đệm khác nhau) là một tặng cho rằng hai chuỗi có độ dài khác nhau và do đó không thể giống hệt nhau.
CVn

Câu trả lời:


56

Bạn đang mã hóa (hơi) các chuỗi khác nhau:

$ echo 'bmVvNGo6QE4=' | base64 --decode | od -c
0000000   n   e   o   4   j   :   @   N
0000010
$ echo 'neo4j:@N' | od -c
0000000   n   e   o   4   j   :   @   N  \n
0000011

echothêm một ký tự dòng mới. Điều này dẫn đến các bảng mã khác nhau.

Sử dụng printfthay thế, có đặc điểm kỹ thuật đầu ra chính xác hơn:

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=

10
Câu trả lời tuyệt vời, nâng cao. lưu ý rằng $ echo -n "neo4j:@N" | base64cũng hoạt động.
Doug Smythies

7
@DougSmythies thì có, nhưng printfnhất quán hơn nhiềuecho .
muru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.