Сгенерируйте пароль для / etc / shadow вручную


109

Мне нужно вручную отредактировать, /etc/shadowчтобы изменить корневой пароль внутри образа виртуальной машины.

Существует ли инструмент командной строки, который принимает пароль и генерирует /etc/shadowсовместимый хэш пароля при стандартном выходе?

Ответы:


126

Вы можете использовать следующие команды для одного и того же:

Метод 1 (MD5, Sha256, Sha512)

openssl passwd -6 -salt xyz  yourpass

Примечание: при прохождении -1будет создан пароль MD5, -5SHA256 и -6SHA512 (рекомендуется)

Метод 2 (MD5, Sha256, Sha512)

mkpasswd --method=SHA-512 --stdin

Методы принимает md5, sha-256иsha-512

Метод 3 (des, md5, sha256, sha512)

Как предложил @tink, мы можем обновить пароль, chpasswdиспользуя:

echo "username:password" | chpasswd 

Или вы можете использовать зашифрованный пароль с chpasswd. Сначала сгенерируйте это, используя это:

perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'

Затем позже вы можете использовать сгенерированный пароль для обновления:

echo "username:encryptedPassWd"  | chpasswd -e

Этот зашифрованный пароль мы можем использовать для создания нового пользователя с паролем, например:

useradd -p 'encryptedPassWd'  username

3
При использовании chpasswd -eобязательно используйте одинарные кавычки в строке, в которой вы находитесь echo; в противном случае, если есть $или другие специальные символы, они не будут рассматриваться буквально.
Загс

4
Обратите внимание, что make из них попадет в историю вашей оболочки. Я бы использовал, openssl passwd -1который 1) не заканчивается там и 2) генерирует случайную соль для вас (которая также не попадает в историю оболочки).
Ztyx,

1
openssl passwdдокументация для тех, кто пытается выяснить, что -1делает опция.
CivFan

4
Для хэша SHA-512: python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- из соответствующего вопроса ServerFault
CivFan

9
Метод 1) и 2) выше использует MD5 для хеширования. MD5 больше не считается лучшей практикой, так как имели место коллизии хешей. Используйте метод 3) или тот, который описан в unix.stackexchange.com/a/198906/10911 .
Ztyx

36

В Ubuntu 12.04 есть mkpasswd (из пакета whois): переизбыток внешнего интерфейса в crypt (3)

mkpasswd  -m sha-512 -S saltsalt -s <<< YourPass

Где:

  • -m= Вычислить пароль, используя метод TYPE. Если TYPE - справка, доступные методы выводятся на печать.
  • -S = соль используется.

Например

$ mkpasswd -m help

-s = Read password from stdin

8
Не нужно указывать соль, mkpasswd позаботится о генерации случайной.
К 마 SE

1
Независимо от того, что сгенерированные пароли из mkpasswd, скопированные в / etc / passwd, всегда терпят неудачу. Есть ли способ проверить правильность хеша, созданного mkpasswd?
CMCDragonkai

@CMCDragonkai: Неправильный вопрос. Вы должны спросить, что ожидает ваша система.
user3183018

1
@ To 마 SE: Иногда полезно контролировать соль. Я использовал его при тестировании генерации паролей в хэше для веб-приложения, где я хранил соль в отдельном магазине. Например, хэшированный пароль в БД MySQL и соль пользователя в Redis.
user3183018

15

Это решение имеет следующие преимущества:

  • Ничего дополнительного для установки
  • Не хранит пароль в истории вашей оболочки
  • Создает случайную соль для вас
  • Использует современный, сильный алгоритм хеширования, SHA-512
  • Повторно запрашивает пароль, чтобы избежать ошибок.

    $ python3 -c "from getpass import getpass; from crypt import *; \
        p=getpass(); print('\n'+crypt(p, METHOD_SHA512)) \
        if p==getpass('Please repeat: ') else print('\nFailed repeating.')"
    

Рекомендации


3

Для тех, у кого нет систем на основе Debian. Python3 работает так же хорошо.

python3 -c 'import crypt; print(crypt.crypt("test"))'

ПРИМЕЧАНИЕ . Строка «test» - это пароль, который мы генерируем в виде зашифрованной строки.


По некоторым причинам использование crypt.mksaltне работает при генерации паролей для /etc/shadow. Но метод @ Alex131089 работает!
maulinglawns

Просто потратил 1,5 часа, пытаясь этот метод, прежде чем я заметил комментарий. Может кто-нибудь удалить это? Я пока не могу понизить голос.
Михал Ф

1
@ MichałF кажется, что это не сработало, потому что соление не было сделано правильно. Спасибо за указание на это. Я удалил соль, потому что соление зависит от ОС, и в моем ответе нецелесообразно учитывать все диапазоны ОС. Вы должны использовать метод 1, описанный @RahulPatil, потому что он позволяет использовать соление и opensslявляется довольно универсальным инструментом.
Грег

Не рекомендуется, так как он оставляет ваш пароль в истории вашей оболочки.
Марк Стосберг

Я имею в виду, вы всегда можете удалить cmd из своей истории оболочки
Грег

3

Ни один из существующих методов не является приемлемым для меня - они либо передают пароль в командной строке (которая заканчивается в истории моей оболочки), требуют установки дополнительных утилит ( python3, makepasswd), используют жестко запрограммированные соли или используют старые методы хеширования.

Этот метод генерирует хэши SHA-512 после запроса пароля и использует случайную соль.

Метод, использующий Python 2 без каких-либо нестандартных библиотек:

python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'

Чтобы сделать это без приглашения: (Это оставит ваш пароль в истории команд)

python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'

2
Чтобы не оставлять пароль в истории команд, вы можете установить (по крайней мере для bash) переменную среды HISTCONTROL в значение «ignorespace», а затем добавить начальный пробел перед командой.
adam820

@ adam820: Это один из способов ... Это все равно будет отображаться в psвыходных данных в доли секунды, в течение которых выполняется команда. (Самым безопасным остается использовать версию, запрашивающую пароль)
Герт ван ден Берг

2

opensslИ chpasswd -eпара не работает в моем случае в RHEL6. Объединение openssl passwdи usermod -pкомандование сделали свое дело.

Сгенерируйте хеш-значение пароля вместе со значением соли:

$ openssl passwd -1  -salt 5RPVAd clear-text-passwd43

$1$5RPVAd$vgsoSANybLDepv2ETcUH7.

Затем скопируйте зашифрованную строку в usermod. Обязательно заключите его в одинарные кавычки.

$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root

Проверьте это в теневом файле.

$ grep root /etc/shadow

root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::

1

Еще один метод генерации паролей, это использование opensslинструмента.

Генерация паролей MD5

openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/

Генерация паролей DES

openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2

3
Чем это отличается от метода 1 в ответе Рахула Патила ? Обратите внимание, что старый алгоритм хеширования паролей на основе DES определенно не должен использоваться! Во-первых, он поддерживает пароли длиной до восьми байт, что в наши дни крайне неадекватно.
CVn

3
Цитата Сноудена: «Предположим, ваш противник способен на один триллион догадок в секунду». С не совсем необоснованным набором символов из 70 символов и полностью случайным паролем это составляет 576 секунд - менее десяти минут. Даже против менее способного, но решительного противника это крайне неадекватно .
CVn

Это не очень безопасно, потому что MD5 и DES ...
AdamKalisz

Спасибо за единственный ответ, показывающий, как зашифровать пароли DES! Очень полезно при попытке переопределить пароль root для прошивки IP-камеры.
Malvineous

1

Разобравшись немного с критикой u150825 и Герта ван ден Берга, я обнаружил, что мне нужно что-то относительно гибкое для разных ситуаций с разными системами автоматизации. Я решил добавить в свою небольшую библиотеку полезных скриптов и написать это. Он использует только нативные библиотеки из python 2.7+ и работает на python3 также.

Вы можете забрать его здесь, если хотите. Так же легко отказаться от этого в вашей среде, если вам нужно много использовать его, размещать http или что-то еще, и вы можете запустить его на любой платформе, используя любой интерпретатор Python по умолчанию, который у вас есть. надежно рассчитывает на это работающий.

По умолчанию он запрашивает использование getpass с приглашениями на stderr (что позволяет легко перехватить стандартный вывод), но если вы передадите ему строку, он просто будет извлечен из стандартного ввода. В зависимости от того, как вы это делаете, это может не отображаться в истории команд, поэтому просто знайте, с чем вы работаете. Мне нравится иметь гибкий инструмент, который будет вести себя ожидаемым образом, а не полагаться на пакеты или Python, выстраивающий путь к победе 10 различными способами.


Будет ли Python в какой-либо версии уже установлен или нет, зависит от системы. С чем конкретно проблема chpasswd?
RalfFriedl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.