web-dev-qa-db-fra.com

Pourquoi existe-t-il une incohérence dans la sortie en base64?

J'utilise la base de données de graphes neo4j basée sur Java sur lubuntu 15.04.

L'en-tête d'authentification HTTP neo4j utilise le codage base64 de 'nom d'utilisateur: mot de passe' (sans les guillemets). En utilisant Wireshark, je peux voir le code base64 généré par neo4j.

Cependant, si j'utilise ubuntu coreutils base64 pour encoder la même chaîne, j'obtiens un encodage légèrement différent. Cet encodage n'est pas accepté par neo4j.

Les deux encodages décodent le nom d'utilisateur correct: password string

Exemple

nom d'utilisateur = neo4j et mot de passe = @N

Neo4j donne la valeur codée de neo4j:@N en tant que bmVvNGo6QE4= qui décode en neo4j:@N comme prévu

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

Ubuntu coreutils base64 renvoie la valeur codée de neo4j:@N sous la forme bmVvNGo6QE4K (qui diffère dans le dernier caractère) mais décode toujours correctement;

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

Pourquoi est-ce? Que dois-je faire pour obtenir un codage cohérent?

12
Lozdown

Vous encodez (légèrement) différentes chaînes:

$ 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 ajoute un dernier caractère de nouvelle ligne. Cela conduit à des encodages différents.

Utilisez plutôt printf, dont la spécification de sortie est plus exacte:

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