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 = neo4j
e senha =@N
O Neo4j fornece o valor codificado de neo4j:@N
como bmVvNGo6QE4=
decodificado neo4j:@N
conforme o esperado
$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N
O coreutils do Ubuntu base64
retorna o valor codificado de neo4j:@N
as 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?
fonte
=
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.Respostas:
Você está codificando (ligeiramente) cadeias diferentes:
echo
adiciona um caractere de nova linha à direita. Isso leva a diferentes codificações.Use em
printf
vez disso, cuja especificação de saída é mais exata:fonte
$ echo -n "neo4j:@N" | base64
também funciona.printf
é muito mais consistente do queecho
.