Декодирование двух разных строк base64 возвращает два раза одну и ту же строку
Кодирование / декодирование base64 использует детерминированные алгоритмы. Из-за этого заданная входная строка всегда будет кодироваться в известную выходную строку и наоборот.
Используя браузер для доступа к URL-адресу, защищенному с помощью базовой аутентификации, браузер кодирует пару имя пользователя: пароль в строку base64 и помещает эту строку в заголовок запроса HTTP-авторизации. Используя Firebug, легко прочитать эту закодированную строку с сетевого монитора - назовем ее строкой A.
На малине (запущенной Debian Wheezy) я установил ddclient для обновления записей DNS для моего домена с помощью dyndns. Конфигурация ddclient предоставляется с той же парой имя пользователя: пароль, которая используется для доступа к URL с помощью браузера. Клиент даже пытается получить доступ к тому же URL-адресу (используя обычную аутентификацию), но доступ не удается из-за плохой аутентификации. В отладочном выводе ddclient я могу прочитать строку в кодировке base64 - назовем ее String B.
По любой причине Строка A и Строка B различны! Но они созданы из одной пары имя пользователя: пароль. Если я декодирую строки в оболочке Debian
echo myBase64EncodedStringGoesHere | base64 --decode
или в консоли браузера с помощью JavaScript
atob('myBase64EncodedStringGoesHere')
В результате всегда получается одно и то же имя пользователя: пара паролей, независимо от того, декодирую ли я строку A или строку B.
Мое единственное объяснение состоит в том, что в имени пользователя могут быть некоторые невидимые управляющие символы: конфигурация пароля ddclient, влияющая на результат кодирования base64. Таким образом, я проверил конфигурацию ddclient, используя vi
редактор с командой
:set list
Смотрится все хорошо. Я в тупике. У кого-нибудь есть клей, что происходит?
Обновление 1
из-за комментария @C4stor я проверил, что происходит, когда я беру свою пару имя пользователя: пароль и кодирую ее командой shell
echo username:password | base64
В результате я получаю строку A с отступом символов ==
в конце. Кроме того, из отступа ОС Debian создала ту же строку, что и веб-браузер (используемый в Windows).
Обновление 2
По запросу @ umläute, здесь есть две демонстрационные строки:
Stirng A: bXlkb21haW4uY29tOmRueURucz
String B: bXlkb21haW4uY29tOmR5bkRucz
декодировать их в консоли браузера с помощью
atob('STRING')
дает всегда одну и ту же декодированную строку.
1 ответ
В конфигурационном файле ddclient должно быть несколько невидимых управляющих символов, возможно, из-за копирования и вставки...
С помощью vi
Я удалил содержимое из файла и написал каждую строку вручную. Теперь ddclient создает ожидаемую строку в кодировке base64.
Я до сих пор удивляюсь, почему я не смог увидеть персонажей с ви :set list
Команда, но, по крайней мере, теперь проблема решена.