Pourquoi y a-t-il une incohérence dans la sortie base64?


12

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 = neo4jet mot de passe =@N

Neo4j donne la valeur codée de neo4j:@Nas bmVvNGo6QE4=qui se décode neo4j:@Ncomme prévu

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

Ubuntu coreutils base64renvoie la valeur codée de neo4j:@Nas 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?


3
Notez que =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.
un CVn du

Réponses:


56

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

echoajoute un caractère de fin de ligne. Cela conduit à des encodages différents.

Utilisez à la printfplace, dont la spécification de sortie est plus exacte:

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

10
Excellente réponse, votée positivement. notez que cela $ echo -n "neo4j:@N" | base64fonctionne aussi.
Doug Smythies

7
muru
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.