Вопрос или проблема
Я пытаюсь создать хэши паролей с помощью 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 бит. Причин этому несколько:
-
Неправильная интерпретация длины соли: Соль, генерируемая с помощью команды
openssl rand -base64 256
, фактически генерируется в байтах, а не в битах. Это создает недоразумение, так как это приведет к созданию байтовой строки длиной 344 символа, что превышает максимально допустимую длину для соли, используемой алгоритмомyescrypt
(32 байта или 256 бит). -
Формат соли: Алгоритм
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
необходимо учитывать, что длина соли строго ограничена. Используя правильные команды и методы генерации соли, вы сможете избежать ошибок и получить желаемые результаты. Надеюсь, эта информация поможет вам успешно сгенерировать хеши паролей, соответствующие вашим требованиям.