mkpasswd/crypt yescrypt не принимает длинные соли

Вопрос или проблема

Я пытаюсь создать хэши паролей с помощью mkpasswd, передавая ему соль длиной (256+13) бит следующим образом:

rand=$(openssl rand -base64 256)        # Создание случайных данных в формате base64.

# Конкатенация типа пароля (yescrypt) с параметрами (j9T) и 
# случайными данными для нашей Соли
salt="\$y\$j9T\$$rand"

# Генерация пароля (включение $y$ означает, что нам не нужно указывать 
# алгоритм)
passwd=$(mkpasswd $password -S "$salt")          

Когда я это запускаю, я получаю ошибку crypt: Invalid argument

Как я могу передать соль длиной 256 бит в mkpasswd yescrypt?

Версии:
mkpasswd 5.5.20

Существует две причины такого поведения.

Одна из них заключается в том, что openssl rand генерирует байты, а не биты. Чтобы сгенерировать соль длиной 256 бит, нужно выполнить openssl rand -base64 32.

Другая причина в том, что соль ожидается длиной 32 байта (т.е. 256 бит) или (16-1) байта (т.е. 128 бит). Это означает, что вам нужно учитывать 7-байтовый префикс (т.е. $y$j9T$).

Тесты, которые я провел, работали только для 16-байтов и 32-байтов, я не знаю, принимаются ли другие значения.

В качестве альтернативы, вы можете просто использовать mkpasswd <secret> -m yescrypt, и он сгенерирует соль для вас.

Ответ или решение

Создание хешей паролей с использованием mkpasswd в сочетании с алгоритмом yescrypt требует тщательного подхода к генерации и передаче параметров, особенно когда речь идет о соли. Рассмотрим более подробно вашу проблему и предложенные решения.

Проблема с длинной солью

Вы столкнулись с ошибкой crypt: Invalid argument, когда пытаетесь передать соль длиной более 256 бит. Причин этому несколько:

  1. Неправильная интерпретация длины соли: Соль, генерируемая с помощью команды openssl rand -base64 256, фактически генерируется в байтах, а не в битах. Это создает недоразумение, так как это приведет к созданию байтовой строки длиной 344 символа, что превышает максимально допустимую длину для соли, используемой алгоритмом yescrypt (32 байта или 256 бит).

  2. Формат соли: Алгоритм yescrypt, как правило, ожидает соль, размером 32 байта (256 бит) или 16-1 байт (128 бит) после учета префикса. В вашем случае префикс составляет 7 байт ($y$j9T$), поэтому при передаче соли нужно учитывать эту длину. Следовательно, передаваемая соль должна быть не более 25 байт, чтобы в итоге не превысить максимальную длинну.

Решение

Чтобы успешно сгенерировать хеш пароля с использованием короткой соли, используйте команду openssl rand с правильными параметрами. Для создания соли размером 32 байта (256 бит) вам нужно выполнить следующую команду:

rand=$(openssl rand -base64 32) # Генерация случайных данных в формате base64

Затем при формировании строки для соли помните, что она должна быть корректной по длине:

salt="\$y\$j9T\$$rand" 

Как упоминалось выше, учитывайте, что итоговая длина соли не должна превышать 32 байта. Пользовательские тесты показывают, что значения 16 и 32 байт находятся в пределах допустимого. Следует избегать значений, превышающих эти размеры.

Альтернативный способ

Если использование длинной соли не является критичным для вашей задачи, вы можете просто воспользоваться командой:

mkpasswd <secret> -m yescrypt

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

Вывод

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

Оцените материал
Добавить комментарий

Капча загружается...