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 = neo4j
dan kata sandi =@N
Neo4j memberikan nilai yang dikodekan neo4j:@N
sebagai bmVvNGo6QE4=
yang diterjemahkan menjadi neo4j:@N
seperti yang diharapkan
$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N
Ubuntu coreutils base64
mengembalikan nilai yang disandikan neo4j:@N
sebagai 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?
sumber
=
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.Jawaban:
Anda menyandikan (sedikit) string yang berbeda:
echo
menambahkan karakter baris baru yang tertinggal. Ini mengarah pada pengkodean yang berbeda.Gunakan
printf
sebaliknya, yang spesifikasi outputnya lebih tepat:sumber
$ echo -n "neo4j:@N" | base64
berfungsi juga.printf
jauh lebih konsisten daripadaecho
.