Как хешировать пароли в Linux
Пароли никогда не должны храниться в виде обычного текста. Идет ли речь о веб-приложении или операционной системе, они всегда должны быть в хеш-виде (в Linux, например, хешированные пароли хранятся в файле /etc/shadow
). Хеширование — это процесс, с помощью которого с помощью некоторых сложных алгоритмов пароль превращается в другую строку. Такой процесс является односторонним: нет никакого способа вернуть хешированный пароль к его исходной, обычной текстовой форме. Хеширование часто включает в себя использование случайных данных в качестве дополнительных входных данных для алгоритма хеширования, так что один и тот же пароль, хэшированный два раза, не дает одного и того же результата. Эти случайные данные называются солью. В этом уроке мы рассмотрим некоторые методы, которые мы можем использовать для хеширования паролей в Linux.
В этом уроке вы узнаете:
- Как хэшировать пароль с помощью утилиты mkpasswd
- Как хешировать пароль с помощью python и модуля crypt
- Как хешировать пароль с помощью openssl
Требования к программному обеспечению и используемые условные обозначения
Хеширование пароля с помощью mkpasswd
Первый метод генерации хэша пароля, который мы обсуждаем в этом уроке, заключается в использовании утилиты mkpasswd
, поэтому самое первое, что нужно сделать, это убедиться, что она установлена в нашей системе. Приложение доступно в официальных репозиториях всех наиболее часто используемых дистрибутивов Linux. Чтобы установить его на Fedora, мы должны выполнить следующую команду:
sudo dnf install mkpasswd
В Debian и его многочисленных производных, вместо этого, приложение является частью пакета "whois" (оно должно быть установлено по умолчанию в любом случае):
sudo apt install whois
Как только приложение установлено в нашей системе, мы можем использовать его для хеширования нашего простого пароля. Основной синтаксис следующий:
mkpasswd -m <hashing-algorithm>
С помощью опции -m
(сокращение от --method
) мы указываем, какой алгоритм хеширования мы хотим использовать. Чтобы получить список доступных, нам просто нужно передать "help" в качестве аргумента опции:
mkpasswd -m help
Available methods:
yescrypt Yescrypt
gost-yescrypt GOST Yescrypt
scrypt scrypt
bcrypt bcrypt
bcrypt-a bcrypt (obsolete $2a$ version)
sha512crypt SHA-512
sha256crypt SHA-256
sunmd5 SunMD5
md5crypt MD5
bsdicrypt BSDI extended DES-based crypt(3)
descrypt standard 56 bit DES-based crypt(3)
nt NT-Hash
Рекомендуемый алгоритм — sha512crypt
(именно такой используется на Linux). Как только мы выполним команду, нам будет предложено ввести пароль, который мы хотим хэшировать. Программа работает в интерактивном режиме из соображений безопасности: если бы нам пришлось вводить пароль в виде обычного текста непосредственно в качестве аргумента какой-либо опции, он был бы виден как в выводе ps
как часть команды, так и в истории оболочки.
Хешированный пароль возвращается в качестве выходных данных команды:
mkpasswd -m sha512crypt
Password:
$6$2sE/010goDuRSxxv$o18K52wor.wIwZp6aXXBC69phYwPQahKQo2ex8ce2.f0V9BtnYZc0KtTB0WGm2m5pNOcL1Ep3kgDWmJCz36B./
Соль генерируется случайным образом, но для явной передачи значения мы можем использовать опцию -s
(сокращение от --salt
).
Если по какой-то причине мы все еще хотим ввести пароль для хеширования неинтерактивным способом (опять же, это не рекомендуется), мы должны использовать опцию --stdin
и некоторую магию перенаправления:
mkpasswd -m sha512crypt --stdin <<< "plainpassword"
Хеширование пароля с помощью Python
Еще один метод, который мы можем использовать для генерации хэша пароля в Linux, — это использование Python и модуля crypt
. В качестве первого шага мы импортируем модуль, затем используем включенную в него функцию crypt
. Функция имеет один обязательный аргумент, который представляет собой обычный текст, который мы хотим зашифровать; Он возвращает односторонний хешированный пароль с добавлением соли. Метод хеширования может быть передан явно в качестве второго аргумента функции, выбрав один из следующих (если один из них не указан, используется самый сильный, доступный на платформе):
- склеп. METHOD_SHA512
- склеп. METHOD_SHA256
- склеп. METHOD_BLOWFISH
- склеп. METHOD_MD5
- склеп. METHOD_CRYPT
Склеп. METHOD_SHA512
самый сильный. При использовании пароль хешируется с помощью функции sha512, с солью в 16
символов.
Для того, чтобы избежать передачи оригинального пароля в составе команды, который также будет запомниться в истории оболочки python, мы также должны импортировать модуль getpass
, и сделать так, чтобы пароль запрашивался интерактивно с помощью метода getpass(),
включенного в него.
Чтобы сгенерировать наш хешированный пароль, мы должны действовать следующим образом:
>>> import crypt
>>> import getpass
hashed_password = crypt.crypt(getpass.getpass(), crypt.METHOD_SHA512)
Password:
При работе из оболочки приведенный выше пример может быть выполнен как однострочный, вызвав интерпретатор Python с опцией -c
, которая позволяет нам указать команду, которая должна быть выполнена напрямую:
hashed_password="$(python3 -c 'import crypt; import getpass; print(crypt.crypt(getpass.getpass(), crypt.METHOD_SHA512))')"
В приведенном выше примере вы можете заметить, что мы использовали функцию print()
для вывода сгенерированного хешированного пароля, так что он будет использоваться как результат подстановки команды и станет значением переменной hashed_password
.
Хеширование пароля с помощью openssl
Третий и последний метод генерации хэша пароля, который мы рассмотрим в этом руководстве, заключается в использовании команды openssl passwd
. По умолчанию команда использует алгоритм crypt
для генерации хешированного пароля. Чтобы использовать алгоритм sha512
, вместо этого нам нужно использовать опцию -6
. Вот что мы напишем:
openssl passwd -6
Password:
Verifying - Password:
$6$82Bk5H60hZqXBSUp$GPdqJ1zNQOXwuXqUBBB59a4oaKah/HpR3nbiNrW1eXXPH48mTRZ3y6cOOMHnBtMjLF9IBfhDWfQMXMk8kM5kZ/
Как видите, по причинам безопасности, о которых мы уже упоминали, даже при этом способе пароль запрашивается в интерактивном режиме; Кроме того, нам также предлагается вставить его во второй раз, чтобы подтвердить его. Это поведение можно отключить с помощью опции --noverify
.
Как и в случае с другими методами, соль генерируется автоматически, но у нас есть возможность предоставить ее напрямую с помощью опции --salt
:
openssl passwd -6 --salt <SALT>
У нас также есть возможность прочитать пароль из файла. Все, что нам нужно сделать, это использовать опцию -in
и передать путь к файлу, содержащему пароль, в качестве аргумента. Предположим, что наш пароль записан в файл password.txt
, мы напишем:
openssl passwd -6 -in password.txt
При использовании последнего варианта мы можем предоставить более одного пароля в файле (по одному на строку). Они будут хешированы отдельно и результат будет возвращен командой.
Наконец, если нас не волнуют последствия для безопасности, мы можем передать пароль для хеширования непосредственно в качестве последнего аргумента команды:
openssl passwd -6 "plainpassword"
Заключение
В этом уроке мы рассмотрели три метода, которые мы можем использовать для хеширования паролей в Linux. Мы рассмотрели, как использовать утилиту mkpasswd
, как сгенерировать хеш пароля с помощью языка программирования Python с помощью модуля crypt
и, наконец, как выполнить ту же операцию с помощью openssl
.