Пароли никогда не следует хранить в виде обычного текста.
Независимо от того, идет ли речь о веб-приложении или операционной системе, они всегда должны быть в виде хэша (в Linux, например, хэшированные пароли хранятся в файле /etc/shadow).
Хеширование – это процесс, в ходе которого с помощью сложных алгоритмов пароль превращается в другую строку.
Такой процесс является односторонним: не существует способа вернуть хэшированный пароль к его первоначальному виду.
Хеширование часто предполагает использование случайных данных в качестве дополнительного входа для алгоритма хеширования, чтобы один и тот же пароль, хешированный два раза, не давал одинакового результата.
Эти случайные данные называются солью.
В этом уроке мы рассмотрим некоторые методы, которые можно использовать для хэширования паролей в Linux.
Хеширование пароля с помощью mkpasswd
Первый метод генерации хэша пароля, который мы рассмотрим в этом руководстве, заключается в использовании утилиты mkpasswd, поэтому первым делом необходимо убедиться, что она установлена в нашей системе.
Ранее мы уже рассматривали этот инструмент в статьях:
- Как обезопасить ваш сервер Linux
- 📜 Как создать зашифрованный пароль пользователя Linux для Ansible
- 5 способов создать рандомный / надежный пароль в терминале Linux
- Как защитить паролем загрузчик GRUB в Linux
Приложение доступно в официальных репозиториях всех наиболее распространенных дистрибутивов 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.
Функция имеет один обязательный аргумент – открытый текст, который мы хотим зашифровать; она возвращает односторонне хэшированный пароль, дополненный солью.
Метод хэширования можно передать явно в качестве второго аргумента функции, выбрав один из следующих (если он не указан, используется самый сильный из доступных на платформе):
- crypt.METHOD_SHA512
- crypt.METHOD_SHA256
- crypt.METHOD_BLOWFISH
- crypt.METHOD_MD5
- crypt.METHOD_CRYPT
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.
Ранее мы уже рассматривали этот инструмент в статьях:
- 🐧 Как создать пароль, для базовой аутентификации (basic )пользователей HTTP
- 📜 Как защитить Netdata с помощью базовой аутентификации
- Настройка IPSec VPN-сервера с L2TP и Cisco IPsec на Ubuntu / CentOS / Debian
- 🐧 Как использовать зашифрованный пароль в скриптах Bash
- 💗 Советы и рекомендации по обеспечению безопасности вашего веб-сервера Nginx
- Менеджер паролей командной строки для Linux
По умолчанию команда использует алгоритм crypt для генерации хэша пароля.
Чтобы использовать алгоритм sha512, вместо него нужно использовать опцию -6.
Вот что мы напишем:
$ openssl passwd -6 Password: Verifying - Password: $6$82Bk5H60hZqXBSUp$GPdqJ1zNQOXwuXqUBBB59a4oaKah/HpR3nbiNrW1eXXPH48mTRZ3y6cOOMHnBtMjLF9IBfhDWfQMXMk8kM5kZ/