Ответ
В современных дистрибутивах Linux хэши паролей пользователей хранятся в защищённом файле /etc/shadow. Раньше они находились в /etc/passwd, но это было небезопасно, так как файл должен быть читаемым для всех.
Формат записи в /etc/shadow:
Каждая строка соответствует одному пользователю и имеет поля, разделённые двоеточиями ::
username:$y$j9T$8S7zqBVDN3uGcFbQcLbTx/$N4WgYVpLz6Hk5rE8vJ2qCx1m3s4d5f6h7i8j9k0l:19215:0:99999:7:::
Разберём ключевые поля:
username: Имя пользователя.- Хэш пароля:
$y$j9T$8S7zqBVDN3uGcFbQcLbTx/$N4WgYVpLz6Hk5rE8vJ2qCx1m3s4d5f6h7i8j9k0l$y$— идентификатор алгоритма (здесьyозначаетyescrypt, современный алгоритм. Также встречаются6— SHA-512,5— SHA-256,1— MD5).j9T— соль (salt), случайная строка, уникальная для каждого пароля.- Далее идёт собственно хэш, полученный в результате криптографической функции от пароля, соли и, возможно, количества раундов.
19215: Дата последнего изменения пароля (количество дней с 1 января 1970).0: Минимальный срок действия пароля (дней до возможной смены).99999: Максимальный срок действия пароля (дней до обязательной смены).7: Количество дней для предупреждения об истечении срока.
Практический пример создания хэша:
# Генерация хэша с алгоритмом yescrypt (используется по умолчанию в новых системах)
openssl passwd -6 -salt "MyRandomSalt" "MySecretPassword"
# Или с помощью утилиты, которая использует системный алгоритм:
mkpasswd -m sha-512crypt --salt="MyRandomSalt" "MySecretPassword"
Важно для DevOps: При автоматическом создании пользователей (через Ansible, Puppet) мы задаём пароль именно в таком захэшированном виде, а не в открытом. Файл /etc/shadow имеет права 640 и принадлежит root:shadow, что предотвращает его чтение обычными пользователями.