Warum ist die Base64-Ausgabe inkonsistent?

12

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 = neo4jund Passwort =@N

Neo4j gibt den codierten Wert von neo4j:@Nas bmVvNGo6QE4=an, der neo4j:@Nwie erwartet decodiert wird

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

Ubuntu coreutils base64gibt den codierten Wert von neo4j:@Nas 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?

Lozdown
quelle
3
Beachten Sie, dass =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.
ein Lebenslauf vom

Antworten:

56

Sie codieren (leicht) unterschiedliche Zeichenfolgen:

$ 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

echoFügt ein abschließendes Newline-Zeichen hinzu. Dies führt zu unterschiedlichen Kodierungen.

Verwenden Sie printfstattdessen, deren Ausgabespezifikation genauer ist:

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=
muru
quelle
10
Tolle Antwort, positiv bewertet. Beachten Sie, dass dies auch $ echo -n "neo4j:@N" | base64funktioniert.
Doug Smythies
7
@DougSmythies tut es, ist aber printfweitaus konsistenter alsecho .
muru