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 wirehark, je peux voir le code base64 généré par neo4j.
Cependant, si j'utilise la base64 ubuntu coreutils 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 vers le nom d'utilisateur correct: chaîne de mot de passe
Exemple
nom d'utilisateur = neo4j
et mot de passe =@N
Neo4j donne la valeur codée de neo4j:@N
as bmVvNGo6QE4=
qui se décode neo4j:@N
comme prévu
$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N
Ubuntu coreutils base64
renvoie la valeur codée de neo4j:@N
as 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? De quoi ai-je besoin pour obtenir un encodage cohérent?
la source
=
dans Base64 normal est le remplissage (et seulement valide à la fin). Le fait qu'une chaîne codée ait un remplissage et l'autre pas (ou plus généralement, que les deux chaînes aient des quantités différentes de remplissage) est un signe mort que les deux sont de longueur différente et ne peuvent donc pas être identiques.Réponses:
Vous encodez (légèrement) différentes chaînes:
echo
ajoute un caractère de fin de ligne. Cela conduit à des encodages différents.Utilisez à la
printf
place, dont la spécification de sortie est plus exacte:la source
$ echo -n "neo4j:@N" | base64
fonctionne aussi.printf
est beaucoup plus cohérent queecho
.