Есть две части к этому:
- Почему мы преобразуем строку в массив байтов, прежде чем переваривать?
- Почему мы преобразуем дайджест в шестнадцатеричный?
Первый ответ: дайджест только работа над байтами массивов. Они не знают строк, цифр или любого другого типа данных. Просто байты. Итак, мы берем объект String
и преобразуем его в массив байтов, используя некоторую форму текстового кодирования, такую как UTF-8.
Обратите внимание, что кодирование важно: я могу кодировать строку «привет мир» в UTF-8, UTF-16 или US-ASCII, или любое количество других кодировок. Если я выберу UTF-8, он будет генерировать 11 байтов вывода (поскольку «hello world» имеет длину 11 символов), но UTF-16 будет генерировать 22 байта вывода. Эти два кодирования будут производить различные дайджесты, поэтому знание кодирования жизненно важно.
Второй ответ заключается в том, что дайджесты часто используются в строковых протоколах, таких как HTTP-файлы cookie, для хранения хэшей паролей в текстовых столбцах в базах данных, для добавления подписей PGP к сообщениям электронной почты и т. Д.
Поскольку дайджест создает массив необработанных байтов, его необходимо перекодировать в нечто дружественное к тексту. Вот почему используется шестнадцатеричный (или, более вероятно, base-64).
Например, придерживаясь примера «привет мир», скажем, дайджест с кодировкой UTF-8 превращается в массив байтов со следующими значениями: 4 27 125 8 0 22 90 7
(для моей мифической 8-байтовой функции дайджеста). Если бы я попытался интерпретировать это как строку UTF-8, я бы получил много мусора: 0 не является печатным символом. Кодирование в шестнадцатеричном виде означает, что я могу распечатать его значимым образом или добавить его в свой PGP-адрес электронной почты или что-то еще.
Это имеет смысл?
действительно. это было потрясающе. Спасибо. последующий вопрос - когда я использую команду sha2sum в linux, я предполагаю, что он выполняет вышеуказанные операции (хотя и в diff lang, чем Java). является результатом этой команды в base64 или hex? –
Не знаю. Если это то же самое, что и «md5sum» (но с использованием SHA2), то я бы предположил hex. Если выход целиком [0-9a-f], то он шестнадцатеричный; если выход [a-zA-Z0-9 + /], то это base64. Вы также можете подсчитать количество символов: hex - 4 бита на символ, так что хэш-схема sha-256 потребует 64 символа в шестнадцатеричном формате.Base64 имеет 6 бит на символ, поэтому ему потребуется всего 43 символа. –
потрясающий, это очищает вещи. благодаря! –