Давайте посмотрим, как мы можем генерировать действительно случайные пароли в Linux — сначала используя только стандартные инструменты, которые уже есть в системе, затем мы рассмотрим полезные инструменты сторонних производителей.
Во-первых, нам нужен хороший источник случайности. Есть старая шутка, что лучший способ сгенерировать действительно случайную строку на Linux — это посадить нового пользователя перед vim или emacs и попросить его выйти. /dev/urandom обычно является вторым лучшим выбором.
/dev/urandom
По сути, /dev/urandom — это специальный файл, который предоставляет нам поток случайных байтов (собранных из шума окружающей среды от таких источников, как драйверы устройств).
Существует также /dev/random, но он уже почти устарел, в настоящее время редко есть веские причины для его использования.
Если вы попытаетесь прочитать /dev/urandom напрямую с помощью:
cat /dev/urandom
Это быстро сломало бы ваш терминал непечатаемыми символами. Поэтому нам нужен способ ограничить набор возвращаемых символов.
Когда вы работаете с переводом или фильтрацией наборов символов, tr
является очень удобным инструментом (а поскольку он входит в пакет coreutils
, вы почти наверняка уже имеете его в своей системе).
Мы можем определить набор символов (-c) и удалить все остальное (-d) следующим образом:
cat /dev/urandom | tr -dc a-zA-Z0-9
Или, чтобы удалить ненужное использование команды cat
:
tr -dc a-zA-Z0-9 </dev/urandom
Это работает, но дает нам непрерывный поток символов, определенных в нашей кодовой таблице. Теперь нам просто нужен способ ограничить количество возвращаемых символов. Мы можем легко сделать это с помощью команды head
:
tr -dc a-zA-Z0-9 </dev/urandom | head -c 15
head -c
делает именно то, что нам нужно: она просто возвращает первые 15 байт данных из нашего потока.
И это дает нам случайный пароль из 15 символов, как и ожидалось, например:
0vp3HkQS52xqvuR
Энтропии этого типа пароля должно хватить для большинства случаев, но если вам нужно больше, вы можете легко включить дополнительные символы:
tr -dc 'a-zA-Z0-9_!"#$%&' </dev/urandom | head -c 15
Примечание: Ваш терминал может быть недоволен отсутствием символа новой строки — ни tr
, ни head
не добавляют символ новой строки (теоретически, мы могли бы получить его из /dev/urandom, но он будет удален tr
). Это можно легко исправить, добавив после команды echo
пустую команду:
tr -dc a-zA-Z0-9 </dev/urandom | head -c 15; echo
openssl
Если по какой-то причине вы не можете использовать /dev/urandom, openssl
также может генерировать действительно случайные строки.
Если вас устраивают только символы из base64 charset, вам не нужно ничего, кроме openssl
:
openssl rand -base64 15
или hex:
openssl rand -hex 15
В противном случае мы можем создать случайные байты с помощью openssl rand
, но поскольку он не поддерживает потоковую передачу, нам нужно создать достаточно байт, чтобы потом отфильтровать их:
openssl rand 512 | tr -dc a-zA-Z0-9 | head -c 15
Это должно дать нам результат, очень похожий на предыдущую команду с /dev/urandom.
pwgen
Теперь, когда вы знаете, как сделать это самостоятельно, стоит упомянуть инструмент pwgen
, который создаст набор случайных паролей, но постарается сделать их произносимыми и легко запоминаемыми человеком.
Он доступен в официальных репозиториях большинства основных дистрибутивов, и вы можете установить его примерно так:
apt install pwgen
dnf install pwgen
pacman -S pwgen
Например, это создаст набор из 20 паролей по 15 символов:
pwgen 15 20
Результат примера:
zo2aiTaiveey8xi Iephohpiush4Aik Oos4Riekieshohs eisheGheeh4an5y thah1seesho0ooZ
eedeithogaiRa3i Chie9uchaigh3iz aix2Ung2oid2ivi quiavaiMie3Fahv iesho1Kughienai
UuBu4wei0hiuCas jai6OwooniNgahm ieVox0shi3xehoh oo4haaHaijaesh3 eic8aiGohcuyah5
ii5eoDooc8ui6Sh Goohei7ureetu0B ceiB3auK9eiquu0 koSoh7ea6ga7On0 uxeing6dah3haiF
makepasswd
Существует также старый инструмент под названием makepasswd
, который похож на pwgen
, но он больше ориентирован на случайные, чем на произносимые пароли.
Вы можете установить его, используя что-то вроде:
apt install makepasswd
dnf install makepasswd
Проблема с makepasswd заключается в том, что он использует старый интерфейс /dev/random, что может вызвать проблемы с блокировкой, особенно в средах, не имеющих доступа к большому количеству источников энтропии (например, виртуальные машины).
Эквивалентный пример приведенной выше команды pwgen выглядел бы следующим образом:
makepasswd --chars=15 --count=20
Результат примера:
MrIYQswWdFKMbm5
S2QszHCUs1F04Ge
bzpLR4agSpqtIX0
rYw9E2psW8bnwFg
BocTzXeGda54K9i
ELQytdfXDzGGfXR
ufJuUt7d8C2KimN
CKJQos4rIHdAGv4
njTM48Ku2VJXfb9
K3qaP5WGAe6wCcg
ePD6Lr8z0GybYCz
RMrih3WpXxw0RGc
xGVeQGtWn8pq63H
LqvL7MQb8FQabDn
7J7t1Yg0e2whEUH
JuA1WxXRR6XeRPm
sG6oWN8q8SMroz1
Womp56gy0uemUjj
prnbNr5sJGGI1gw
0a6K8oebrBKhBcb
Примечание: это вики-статья из серии BetterWays.dev: Linux на примере, вы можете найти последнюю (лучше отформатированную) версию здесь: https://betterways.dev/linux-generating-random-passwords.
Если вы находите этот тип статьи интересным, пожалуйста, дайте мне знать (с реакцией и/или комментариями).