Чому виникає невідповідність у виході base64?


12

Я використовую базу даних графіків neo4j на базі Java на lubuntu 15.04.

Заголовок аутентифікації neo4j HTTP використовує base64 кодування 'ім'я користувача: пароль' (не включаючи лапки). Використовуючи wireshark, я можу побачити базовий код64, породжений neo4j.

Однак якщо я використовую ubuntu coreutils base64 для кодування тієї ж строки, я отримую трохи інше кодування. Це кодування нео4j не приймається.

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

Приклад

ім'я користувача = 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

Чому це? Що потрібно зробити, щоб отримати послідовне кодування?


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також працює.
Doug Smythies

7
@DougSmythies це робить, але printfнабагато послідовніше, ніжecho .
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.