Estoy usando la base de datos de gráficos neo4j basada en Java en lubuntu 15.04.
El encabezado de autenticación HTTP neo4j utiliza la codificación base64 de 'nombre de usuario: contraseña' (sin incluir comillas). Usando wireshark puedo ver el código base64 generado por neo4j.
Sin embargo, si uso ubuntu coreutils base64 para codificar la misma cadena, obtengo una codificación ligeramente diferente. Esta codificación no es aceptada por neo4j.
Ambas codificaciones se decodifican con el nombre de usuario correcto: cadena de contraseña
Ejemplo
nombre de usuario = neo4j
y contraseña =@N
Neo4j da el valor codificado de neo4j:@N
como bmVvNGo6QE4=
que decodifica neo4j:@N
como se esperaba
$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N
Ubuntu coreutils base64
devuelve el valor codificado de neo4j:@N
as bmVvNGo6QE4K
(que difiere en el último carácter) pero aún decodifica correctamente;
$ echo 'neo4j:@N' | base64
bmVvNGo6QE4K
$ echo 'bmVvNGo6QE4K' | base64 --decode
neo4j:@N
¿Por qué es esto? ¿Qué necesito hacer para obtener una codificación consistente?
fuente
=
en cuenta que en Base64 normal es relleno (y solo válido al final). El hecho de que una cadena codificada tenga relleno y la otra no (o de manera más general, que las dos cadenas tienen diferentes cantidades de relleno) es un claro indicio de que las dos son de diferente longitud y, por lo tanto, no pueden ser idénticas.Respuestas:
Estás codificando (ligeramente) diferentes cadenas:
echo
agrega un carácter de nueva línea al final. Esto lleva a diferentes codificaciones.Utilice en su
printf
lugar, cuya especificación de salida es más exacta:fuente
$ echo -n "neo4j:@N" | base64
también funciona.printf
es mucho más consistente queecho
.