Ich benutze die Java-basierte neo4j Graph-Datenbank auf Lubuntu 15.04.
Der HTTP-Authentifizierungsheader von neo4j verwendet die Base64-Codierung 'Benutzername: Kennwort' (ohne Anführungszeichen). Mit wireshark kann ich den von neo4j generierten base64-Code sehen.
Wenn ich jedoch die Ubuntu Coreutils Base64 verwende, um den gleichen String zu kodieren, erhalte ich eine etwas andere Kodierung. Diese Kodierung wird von neo4j nicht akzeptiert.
Beide Kodierungen dekodieren in die richtige Zeichenfolge für Benutzername: Kennwort
Beispiel
Benutzername = neo4j
und Passwort =@N
Neo4j gibt den codierten Wert von neo4j:@N
as bmVvNGo6QE4=
an, der neo4j:@N
wie erwartet decodiert wird
$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N
Ubuntu coreutils base64
gibt den codierten Wert von neo4j:@N
as zurück bmVvNGo6QE4K
(der sich im letzten Zeichen unterscheidet), decodiert aber immer noch korrekt.
$ echo 'neo4j:@N' | base64
bmVvNGo6QE4K
$ echo 'bmVvNGo6QE4K' | base64 --decode
neo4j:@N
Warum ist das? Was muss ich tun, um eine konsistente Codierung zu erhalten?
quelle
=
in normaler Base64 ist padding (und nur dann gültig , am Ende). Die Tatsache, dass eine codierte Zeichenfolge eine Auffüllung aufweist und die andere nicht (oder allgemeiner gesagt, dass die beiden Zeichenfolgen unterschiedliche Auffüllmengen aufweisen), ist ein toter Gewinn, dass die beiden unterschiedlich lang sind und daher möglicherweise nicht identisch sein können.Antworten:
Sie codieren (leicht) unterschiedliche Zeichenfolgen:
echo
Fügt ein abschließendes Newline-Zeichen hinzu. Dies führt zu unterschiedlichen Kodierungen.Verwenden Sie
printf
stattdessen, deren Ausgabespezifikation genauer ist:quelle
$ echo -n "neo4j:@N" | base64
funktioniert.printf
weitaus konsistenter alsecho
.