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


12

Я использую основанную на 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:@Nas bmVvNGo6QE4K(которое отличается последним символом), но все равно правильно декодируется;

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

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


3
Обратите внимание, что =в обычном Base64 это дополнение (и действует только в конце). Тот факт, что одна закодированная строка имеет заполнение, а другая - нет (или, в более общем смысле, то, что две строки имеют разное количество заполнения), является мертвой раздачей того, что эти две строки имеют разную длину и, следовательно, не могут быть идентичными.
CVn

Ответы:


56

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

$ 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=

10
Отличный ответ, проголосовал. обратите внимание, что $ echo -n "neo4j:@N" | base64работает также.
Дуг Смитис

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.