Поиск по сайту:

Как хешировать пароли в 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.

Статьи по данной тематике: