Рейтинг:6

Кодирование соли в виде шестнадцатеричного кода перед плохой практикой хеширования?

флаг in

Я читал вопрос о симметричных ключах здесь и нашел ответ довольно интересным. В нем упоминается:

Обязательно передавайте необработанные байты, а не, например, строку в шестнадцатеричном кодировании.

Кто-нибудь может объяснить, почему это плохо? а также в контексте хеширования паролей, преобразует ли соль в шестнадцатеричный код перед отправкой через HMAC, и если да, то почему?

Patrick Favre avatar
флаг us
Основная тема здесь заключается в том, что когда вы выполняете кодировку (какой бы она ни была, будь то шестнадцатеричная, base64), обязательно декодируйте перед использованием и НЕ используйте байтовое представление ASCII строки кодирования. Криптографические примитивы часто оптимизируются для определенных длин ключей или солей, поэтому, если вы передаете неправильные длины, они часто хэшируются, что может увеличить риск коллизии.
Рейтинг:17
флаг in

Это вообще не говорит о соли, а о реальных симметричных ключах. Цитирую весь абзац:

Большинство сред программирования предоставляют своего рода механизм «безопасного случайного выбора» (CSPRNG). Вы можете использовать это для получения массива байтов соответствующей длины (например, 32 байта для AES256), который можно использовать в качестве ключа. Обязательно передавайте необработанные байты, а не, например, строку в шестнадцатеричном кодировании.

Это означает, что если вы собираетесь сгенерировать 32-байтовый ключ (как показано в абзаце), убедитесь, что это 32 необработанных байта, а не 32 байта ключа в шестнадцатеричной кодировке.

Причина этого проста:

  • 32 необработанных байта 256^32 возможные ключи
  • 32 байта шестнадцатеричных данных 16^32 возможные ключи

Если вам нужно передать ключ в шестнадцатеричном представлении, используйте весь вывод длиной 64 байта.

Что касается засолки, то крепость вашей соли зависит от ее размера.Не имеет значения, является ли он необработанным или шестнадцатеричным, важно возможное количество солей.

Maarten Bodewes avatar
флаг in
Строки также может быть сложнее уничтожить, они могут даже быть «интернализированы», то есть сохранены в течение всего срока службы машины.
A Tea Kettle avatar
флаг in
Спасибо за отличное объяснение!
Ben avatar
флаг tr
Ben
Я не понимаю, чем 32 необработанных байта отличаются от 32 байтов. Судя по вашему объяснению, в байте хранится один шестнадцатеричный символ, но это ненормально. В каждом байте должно быть две шестнадцатеричных цифры, что соответствует 8 битам и 256 возможным значениям.
Marc avatar
флаг in
Две шестнадцатеричные цифры могут представлять один байт. Но если у вас есть строка этого шестнадцатеричного представления, один байт указанной строки будет только одним символом. Это распространенная ошибка, которую совершают люди: берут первые 32 байта шестнадцатеричного представления необработанных данных, не понимая, что отбрасывают половину.
Patrick Favre avatar
флаг us
@marc отличный ответ, однако я согласен с тем, что описание 32 шестнадцатеричных байтов сбивает с толку: почему бы не «32 символа (для которых требуется 32 байта) шестнадцатеричных данных - это `16 ^ 32` возможных ключей"
Рейтинг:3
флаг my

Кто-нибудь может объяснить, почему это плохо?

Кто сказал, что кодирование соли до хеширования было плохим? Когда Тим Маклин написал:

Обязательно передавайте необработанные байты, а не, например, строку в шестнадцатеричном кодировании.

он конкретно говорил о создании ключа для симметричного шифра; он не говорил о создании изображения для хеширования.

Когда вы создаете соль для хэша, нет ничего плохого в использовании шестнадцатеричного кодирования.

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.