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 neo4j HTTP usa a codificação base64 de 'username: password' (sem incluir aspas). Usando wireshark eu 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. Esta 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 = neo4j e senha = @N

O Neo4j fornece o valor codificado de neo4j:@N como bmVvNGo6QE4= , que decodifica para neo4j:@N como esperado

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

O coreutils base64 do Ubuntu retorna o valor codificado de neo4j:@N como 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 eu preciso para obter uma codificação consistente?

    
por Lozdown 30.09.2015 / 23:19

1 resposta

52

Você está codificando sequências (ligeiramente) 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

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

Use printf , cuja especificação de saída é mais exata:

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=
    
por muru 30.09.2015 / 23:34