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 = neo4j
i hasło =@N
Neo4j podaje zakodowaną wartość neo4j:@N
jak bmVvNGo6QE4=
które dekoduje do neo4j:@N
prawidłowo
$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N
Ubuntu coreutils base64
zwraca zakodowaną wartość neo4j:@N
as 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?
źródło
=
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.Odpowiedzi:
Kodujesz (nieco) różne ciągi:
echo
dodaje znak nowej linii. Prowadzi to do różnych kodowań.printf
Zamiast tego użyj , którego specyfikacja wyjściowa jest dokładniejsza:źródło
$ echo -n "neo4j:@N" | base64
również działa.printf
jest o wiele bardziej spójny niżecho
.