Dlaczego w danych wyjściowych base64 występuje niespójność?

12

Korzystam z bazy danych grafu neo4j opartej na Javie na lubuntu 15.04.

Nagłówek uwierzytelniania HTTP neo4j używa kodowania base64 „nazwa użytkownika: hasło” (bez cudzysłowów). Za pomocą wireshark widzę kod base64 wygenerowany przez neo4j.

Jednak jeśli użyję ubuntu coreutils base64 do kodowania tego samego ciągu, otrzymam nieco inne kodowanie. To kodowanie nie jest akceptowane przez neo4j.

Oba kodowania dekodują do poprawnej nazwy użytkownika: ciąg hasła

Przykład

nazwa użytkownika = neo4ji hasło =@N

Neo4j podaje zakodowaną wartość neo4j:@Njak bmVvNGo6QE4=które dekoduje do neo4j:@Nprawidłowo

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

Ubuntu coreutils base64zwraca zakodowaną wartość neo4j:@Nas bmVvNGo6QE4K(która różni się ostatnim znakiem), ale nadal poprawnie dekoduje;

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

Dlaczego to? Co muszę zrobić, aby uzyskać spójne kodowanie?

Lozdown
źródło
3
Zauważ, że =w normalnym Base64 jest wypełnienie (i jest ważne tylko na końcu). Fakt, że jeden zakodowany ciąg ma wypełnienie, a drugi nie (lub bardziej ogólnie, że dwa ciągi mają różne ilości wypełnienia) jest martwy, że oba mają różną długość, a zatem nie mogą być identyczne.
CVn

Odpowiedzi:

56

Kodujesz (nieco) różne ciągi:

$ 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

echododaje znak nowej linii. Prowadzi to do różnych kodowań.

printfZamiast tego użyj , którego specyfikacja wyjściowa jest dokładniejsza:

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=
muru
źródło
10
Świetna odpowiedź, pozytywnie oceniany. zauważ, że to $ echo -n "neo4j:@N" | base64również działa.
Doug Smythies,
7
@DougSmythies to robi, ale printfjest o wiele bardziej spójny niżecho .
muru