🐧 Как хэшировать пароли в системах Linux

Мануал

Пароли никогда не следует хранить в виде обычного текста.

Независимо от того, идет ли речь о веб-приложении или операционной системе, они всегда должны быть в виде хэша (в Linux, например, хэшированные пароли хранятся в файле /etc/shadow).

Хеширование – это процесс, в ходе которого с помощью сложных алгоритмов пароль превращается в другую строку.

Такой процесс является односторонним: не существует способа вернуть хэшированный пароль к его первоначальному виду.

Хеширование часто предполагает использование случайных данных в качестве дополнительного входа для алгоритма хеширования, чтобы один и тот же пароль, хешированный два раза, не давал одинакового результата.

Эти случайные данные называются солью.

В этом уроке мы рассмотрим некоторые методы, которые можно использовать для хэширования паролей в Linux.

Хеширование пароля с помощью mkpasswd

Первый метод генерации хэша пароля, который мы рассмотрим в этом руководстве, заключается в использовании утилиты mkpasswd, поэтому первым делом необходимо убедиться, что она установлена в нашей системе.

Ранее мы уже рассматривали этот инструмент в статьях:

Приложение доступно в официальных репозиториях всех наиболее распространенных дистрибутивов Linux.

Для установки на Fedora необходимо выполнить следующую команду:

$ sudo dnf install mkpasswd

В Debian и его многочисленных производных приложение входит в пакет “whois” (он должен быть установлен по умолчанию):

$ sudo apt install whois
На примере Kali Linux

После установки приложения на нашу систему мы можем использовать его для хэширования нашего обычного пароля.

Основной синтаксис следующий:

$ 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.

Ранее мы уже рассматривали этот инструмент в статьях:

По умолчанию команда использует алгоритм crypt для генерации хэша пароля.

Чтобы использовать алгоритм sha512, вместо него нужно использовать опцию -6.

Вот что мы напишем:

 

$ openssl passwd -6
Password:
Verifying - Password:
$6$82Bk5H60hZqXBSUp$GPdqJ1zNQOXwuXqUBBB59a4oaKah/HpR3nbiNrW1eXXPH48mTRZ3y6cOOMHnBtMjLF9IBfhDWfQMXMk8kM5kZ/

 

Заключение

Добавить комментарий