2013-03-19 6 views
3

После просмотра нескольких онлайн-ссылок для генерации хэшей Java MD5 и SHA *, я заметил, что обычный текст (String of File) претерпевает определенную подготовку перед & после того, как он подается в дайджест объект для генерации хэшей. В частности, данные сначала преобразуются в байтовый массив, а затем передаются в дайджест, а выходной хэш преобразуется в шестнадцатеричный поток. Почему все эти байтовые и шестнадцатеричные преобразования?до и после использования криптографической хеш-функции

PS: Я полагаю, что ответ связан с тем, как объекты Java и Digest выполняют свою деятельность, и мой мотив/вопрос в этом вопросе состоит в том, чтобы понять это поведение и, возможно, получить ссылки на некоторые документы/литературу, которые объясняют это углубленно.

Danke!

ответ

4

Есть две части к этому:

  1. Почему мы преобразуем строку в массив байтов, прежде чем переваривать?
  2. Почему мы преобразуем дайджест в шестнадцатеричный?

Первый ответ: дайджест только работа над байтами массивов. Они не знают строк, цифр или любого другого типа данных. Просто байты. Итак, мы берем объект 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-адрес электронной почты или что-то еще.

Это имеет смысл?

+0

действительно. это было потрясающе. Спасибо. последующий вопрос - когда я использую команду sha2sum в linux, я предполагаю, что он выполняет вышеуказанные операции (хотя и в diff lang, чем Java). является результатом этой команды в base64 или hex? –

+1

Не знаю. Если это то же самое, что и «md5sum» (но с использованием SHA2), то я бы предположил hex. Если выход целиком [0-9a-f], то он шестнадцатеричный; если выход [a-zA-Z0-9 + /], то это base64. Вы также можете подсчитать количество символов: hex - 4 бита на символ, так что хэш-схема sha-256 потребует 64 символа в шестнадцатеричном формате.Base64 имеет 6 бит на символ, поэтому ему потребуется всего 43 символа. –

+0

потрясающий, это очищает вещи. благодаря! –

1

Реализация этих алгоритмов хэширования работает на байтах, а не на чем-то другом, таком как строковые символы. Вот почему вам нужно преобразовать все в байтовую форму.

 Смежные вопросы

  • Нет связанных вопросов^_^