Почему есть несоответствие в выводе base64?

Я использую основанную на java базу данных neo4j graph на lubuntu 15.04.

HTTP-заголовок аутентификации neo4j использует кодировку base64 "имя пользователя: пароль" (не включая кавычки). Используя wireshark, я вижу код base64, сгенерированный neo4j.

Однако если я использую Ubuntu Coreutils Base64 для кодирования той же строки, я получаю немного другую кодировку. Эта кодировка не принята neo4j.

Обе кодировки декодируются на правильное имя пользователя: строка пароля

пример

имя пользователя =neo4j и пароль =@N

Neo4j дает закодированное значение neo4j:@N как bmVvNGo6QE4= который декодирует в neo4j:@N как и ожидалось

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

Ubuntu coreutils base64 возвращает закодированное значение neo4j:@N как bmVvNGo6QE4K (который отличается последним символом), но все еще правильно декодирует;

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

Почему это? Что мне нужно сделать, чтобы получить согласованное кодирование?

1 ответ

Вы кодируете (немного) разные строки:

$ 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 добавляет завершающий символ новой строки. Это приводит к различным кодировкам.

использование printf вместо этого, чья выходная спецификация является более точной:

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=
Другие вопросы по тегам