
Я читалСтатья в Википедиив файле shadow упоминается, что формат строк такой:
$id$salt$hashed
Итак, мой вопрос: как это работает?
Я попытался вычислить хеш для своей учетной записи, к которой у меня был пароль, поэтому я использовал эту команду:
sha512sum {соль}+{мой_чистый_текст_пароль}
Но вывод отличается от хеша, который я вижу сам. Так как же это работает? Что я упускаю?
решение1
Пара вещей, о которых стоит подумать (вам придется прочитать исходники в Linux coreutils и glibc2, чтобы убедиться)
Вывод sha512sum, по-видимому, представляет собой печатную шестнадцатеричную нотацию, тогда как вывод, сохраненный в теневом файле, по-видимому, имеет вид base64, поэтому они будут отличаться.
Я думаю, что sha512sum в теневом файле была пропущена через хеш-функцию более одного раза (
#define ROUNDS_DEFAULT 5000
), тогда как sha512sum просто пропускает «файл» через хеш один раз.Возможно, одна или обе команды добавили отступы для выравнивания данных, но они могут отличаться.
решение2
Если вы хотите создать хеш таким же образом, как /etc/shadow
он хранится в файле, используйте следующую команду:
mkpasswd --method=sha-512 --salt=YOUR_SALT PASSWORD
решение3
зашифрованный пароль
Ссылаться накрипта(3) для получения подробной информации о том, как интерпретируется эта строка.
Если поле пароля содержит строку, которая не является допустимым результатомкрипта(3), например, ! или *, пользователь не сможет использовать пароль Unix для входа в систему (но пользователь может войти в систему другими способами).
Это поле может быть пустым, в этом случае для аутентификации указанного имени входа не требуется никаких паролей. Однако некоторые приложения, которые читают файл /etc/shadow, могут решить вообще не разрешать доступ, если поле пароля пустое.
Поле пароля, начинающееся с восклицательного знака, означает, что пароль заблокирован. Оставшиеся символы в строке представляют поле пароля до того, как пароль был заблокирован.
crypt() — это функция шифрования паролей. Она основана на алгоритме Data Encryption Standard с вариациями, призванными (помимо прочего) препятствовать использованию аппаратных реализаций поиска ключей.
ключ — это введенный пользователем пароль.
соль — это двухсимвольная строка, выбранная из набора [a–zA–Z0–9./]. Эта строка используется для возмущения алгоритма одним из 4096 различных способов.
Взяв самые нижние 7 бит каждого из первых восьми символов ключа, получаем 56-битный ключ. Этот 56-битный ключ используется для многократного шифрования постоянной строки (обычно строки, состоящей из одних нулей). Возвращаемое значение указывает на зашифрованный пароль, серию из 13 печатных символов ASCII (первые два символа представляют собой саму соль). Возвращаемое значение указывает на статические данные, содержимое которых перезаписывается каждым вызовом.