Mengapa ada ketidakkonsistenan dalam output base64?

12

Saya menggunakan basis data grafik neo4j berbasis java di lubuntu 15.04.

Header otentikasi HTTP neo4j menggunakan pengkodean base64 dari 'username: password' (tidak termasuk kutipan). Menggunakan wireshark saya bisa melihat kode base64 yang dihasilkan oleh neo4j.

Namun jika saya menggunakan ubuntu coreutils base64 untuk mengkodekan string yang sama saya mendapatkan pengkodean yang sedikit berbeda. Pengkodean ini tidak diterima oleh neo4j.

Kedua penyandian diterjemahkan ke nama pengguna yang benar: kata sandi string

Contoh

nama pengguna = neo4jdan kata sandi =@N

Neo4j memberikan nilai yang dikodekan neo4j:@Nsebagai bmVvNGo6QE4=yang diterjemahkan menjadi neo4j:@Nseperti yang diharapkan

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

Ubuntu coreutils base64mengembalikan nilai yang disandikan neo4j:@Nsebagai bmVvNGo6QE4K(yang berbeda dalam karakter terakhir) tetapi masih menerjemahkan dengan benar;

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

Kenapa ini? Apa yang harus saya lakukan agar mendapatkan pengkodean yang konsisten?

Lozdown
sumber
3
Perhatikan bahwa =dalam Base64 yang normal adalah padding (dan hanya valid di akhir). Fakta bahwa satu string yang dikodekan memiliki padding dan yang lainnya tidak (atau lebih umum, bahwa kedua string memiliki jumlah padding yang berbeda) adalah hadiah mati bahwa keduanya memiliki panjang yang berbeda dan dengan demikian tidak mungkin identik.
CVn

Jawaban:

56

Anda menyandikan (sedikit) string yang berbeda:

$ 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

echomenambahkan karakter baris baru yang tertinggal. Ini mengarah pada pengkodean yang berbeda.

Gunakan printfsebaliknya, yang spesifikasi outputnya lebih tepat:

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=
muru
sumber
10
Jawaban bagus, terangkat. perhatikan yang $ echo -n "neo4j:@N" | base64berfungsi juga.
Doug Smythies
7
@DougSmythies ya, tapi printfjauh lebih konsisten daripadaecho .
muru