Perché c'è un'incongruenza nell'output di base64?


12

Sto usando il database dei grafici neo4j basato su Java su Lubuntu 15.04.

L'intestazione di autenticazione HTTP neo4j utilizza la codifica base64 di "nome utente: password" (senza virgolette). Usando WireShark posso vedere il codice Base64 generato da Neo4j.

Tuttavia se uso Ubuntu coreutils base64 per codificare la stessa stringa ottengo una codifica leggermente diversa. Questa codifica non è accettata da neo4j.

Entrambe le codifiche vengono decodificate con il nome utente corretto: stringa password

Esempio

username = neo4je password =@N

Neo4j fornisce il valore codificato di neo4j:@Ncome bmVvNGo6QE4=decodifica neo4j:@Ncome previsto

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

Ubuntu coreutils base64restituisce il valore codificato di neo4j:@Nas bmVvNGo6QE4K(che differisce nell'ultimo carattere) ma si decodifica ancora correttamente;

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

Perchè è questo? Cosa devo fare per ottenere una codifica coerente?


3
Si noti che =in Base64 normale è il riempimento (e valido solo alla fine). Il fatto che una stringa codificata abbia un'imbottitura e l'altra non (o più in generale, che le due stringhe abbiano una diversa imbottitura) è un omaggio morto che le due sono di diversa lunghezza e quindi non possono essere identiche.
un CVn

Risposte:


56

Stai codificando (leggermente) stringhe diverse:

$ 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

echoaggiunge un carattere di nuova riga finale. Ciò porta a codifiche diverse.

Utilizzare printfinvece, la cui specifica di output è più esatta:

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=

10
Ottima risposta, votata. nota che $ echo -n "neo4j:@N" | base64funziona anche.
Doug Smythies,

7
@DougSmythies lo fa, ma printfè molto più coerente diecho .
muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.