Por que há uma inconsistência na saída base64?


12

Estou usando o banco de dados de gráficos neo4j baseado em java no lubuntu 15.04.

O cabeçalho de autenticação HTTP neo4j usa a codificação base64 de 'nome de usuário: senha' (sem incluir aspas). Usando o wireshark, posso ver o código base64 gerado pelo neo4j.

No entanto, se eu usar o ubuntu coreutils base64 para codificar a mesma string, recebo uma codificação ligeiramente diferente. Essa codificação não é aceita pelo neo4j.

Ambas as codificações decodificam para o nome de usuário correto: senha string

Exemplo

nome de usuário = neo4je senha =@N

O Neo4j fornece o valor codificado de neo4j:@Ncomo bmVvNGo6QE4=decodificado neo4j:@Nconforme o esperado

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

O coreutils do Ubuntu base64retorna o valor codificado de neo4j:@Nas bmVvNGo6QE4K(que difere no último caractere), mas ainda decodifica corretamente;

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

Por que é isso? O que preciso fazer para obter uma codificação consistente?


3
Observe que =no Base64 normal é preenchimento (e válido apenas no final). O fato de uma corda codificada ter preenchimento e a outra não (ou mais geralmente, que as duas cordas tenham quantidades diferentes de preenchimento) é uma revelação inabalável de que as duas têm comprimento diferente e, portanto, não podem ser idênticas.
um CVn

Respostas:


56

Você está codificando (ligeiramente) cadeias diferentes:

$ 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

echoadiciona um caractere de nova linha à direita. Isso leva a diferentes codificações.

Use em printfvez disso, cuja especificação de saída é mais exata:

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

10
Ótima resposta, votada. note que $ echo -n "neo4j:@N" | base64também funciona.
Doug Smythies

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.