Почему есть несоответствие в выводе 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=