Как создать хеши паролей SHA512 в командной строке


83

В Linux я могу создать хэш пароля SHA1, используя sha1pass mypassword. Есть ли похожий инструмент командной строки, который позволяет мне создавать sha512хэши? Тот же вопрос для Bcryptи PBKDF2.


Ты имеешь в виду sha1sum?

1
@Tichodroma нет, на самом деле в sha1passDebian есть команда, входящая в пакет syslinux-common.
Дероберт

2
Есть sha512sumкоманда, которая входит в coreutils, и аналогично openssl sha512- но не делает ничего лишнего, что sha1passделает.
Кит Томпсон

Ответы:


55

Да, вы ищете mkpasswd, который (по крайней мере, в Debian) является частью whoisпакета. Не спрашивай почему ...

anthony@Zia:~$ mkpasswd -m help
Available methods:
des     standard 56 bit DES-based crypt(3)
md5     MD5
sha-256 SHA-256
sha-512 SHA-512

К сожалению, моя версия по крайней мере не делает bcrypt. Если ваша библиотека C делает это, она должна (и на странице man есть опция -R, чтобы установить силу). -R также работает на sha-512, но я не уверен, что его PBKDF-2 или нет.

Если вам нужно сгенерировать пароли bcrypt, вы можете сделать это довольно просто с помощью Crypt::Eksblowfish::Bcryptмодуля Perl.


70

В любом дистрибутиве Red Hat, таком как Fedora, CentOS или RHEL, команда mkpasswdне включает в себя тот же набор переключателей, что и версия, обычно включаемая в Debian / Ubuntu.

ПРИМЕЧАНИЕ. Команда mkpasswdфактически является частью expectпакета, и ее, вероятно, следует избегать. Вы можете узнать, к какому пакету он принадлежит, с помощью любой из этих команд.

$ yum whatprovides "*/mkpasswd"
-or-
$ repoquery -q --file */mkpasswd

пример

$ repoquery -q --file */mkpasswd
expect-0:5.43.0-8.el5.x86_64
expect-0:5.43.0-8.el5.i386

Оба эти метода лучше, чем использование, rpmтак как пакеты не должны быть установлены для определения местоположения */mkpasswd.

обходные

Чтобы обойти это, вы можете использовать следующие однострочники Python или Perl для генерации паролей SHA-512. Обратите внимание, что они соленые:

Python (> = 3.3)

$ python -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'

или сценарий

$ python -c 'import crypt; print(crypt.crypt("somesecret", crypt.mksalt(crypt.METHOD_SHA512)))'

Python (2.x или 3.x)

$ python -c "import crypt, getpass, pwd; \
             print(crypt.crypt('password', '\$6\$saltsalt\$'))"

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

Примечание: $ 6 $ обозначает sha512. Поддержка этого метода задания алгоритма зависит от поддержки библиотечной функции crypt (3) уровня операционной системы (обычно в libcrypt). Это не зависит от версии Python.

Perl

$ perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"'
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

В этих примерах пароль - это строка «пароль», а соль - «соль соли». В обоих примерах используется $ 6 $, что означает, что вы хотите, чтобы crypt использовал SHA-512.


2
Для однострочного Python вы можете использовать crypt.mksalt(crypt.METHOD_SHA512)для генерации соли вместо фиксированной.
Джейк Кобб

2
@JakeCobb crypt.mksaltдоступен только в Python 3.x
Риккардо Мурри

2
Прежде чем вводить открытый текстовый пароль в командной строке, убедитесь, что в HISTCONTROL установлено значение «ignorespace» (т. Е. Сначала сделайте это в CentOS / RHEL: echo 'export HISTCONTROL = "ignoredups: ignorespace"'> /etc/profile.d /histcontrol.sh && source /etc/profile.d/histcontrol.sh). В противном случае он будет сохранен в вашей ~ / .bash_history.
Патрик

3
Perl (и, вероятно, Python) использует системную функцию "crypt". Таким образом, они не переносимы, им нужна криптографическая функция, которая понимает запрошенный тип хеша. Скрипт OSX этого не делает - он просто возвращает мне строку в зашифрованном DES-стиле.
Дэн Притц

1
@RiccardoMurri У меня есть Python 2.7.5 и у меня есть доступ к crypt.mksaltCentOS 7.1
user12345

15

Вы можете использовать doveadmутилиту, которая входит в dovecotкомплект.

doveadm pw -s SHA512-CRYPT

Пример результата:

{SHA512-CRYPT}$6$0JvQ1LLFESzA16.I$JVdKAIq0igudTq06BMqzT9rL1gRawMPwLr9U3/kBMKUqZdONfa0wubC89C35LKl3aE16CRH57BfGb4ygPLggL1

Просто обрежьте {SHA512-CRYPT}, и вы получите хеш-строку SHA512 .


У меня не работает как обычный пользователь:doveadm(jotik): Fatal: Error reading configuration: stat(/etc/dovecot/dovecot.conf) failed: Permission denied (euid=1000(jotik) egid=100(users) missing +x perm: /etc/dovecot, we're not in group 97(dovecot), dir owned by 0:97 mode=0750)
jotik

12

Запустите эту команду:

$ /sbin/grub-crypt --sha-512

затем введите слово, которое вы хотите хэшировать.


-bash: / sbin / grub-crypt: нет такого файла или каталога
Уилл Шеппард

Я не верю, что grub на c7, поэтому вы можете использовать: python -c 'import crypt, getpass; print (crypt.crypt (getpass.getpass (), crypt.mksalt (crypt.METHOD_SHA512))) '
ucemike

3

Чтобы расширить описанные выше обходные пути @ slm, если вы беспокоитесь о том, что кто-то завладеет вашей историей bash и увидит простой текстовый пароль, вы можете вставить raw_input()в оператор python, куда идут поля соли и пароля, чтобы он запрашивал их у вас. Текст не маскируется, когда вы печатаете, но он не будет отображаться в вашей истории bash. Вы также можете запустить команду с начального пробела, но я всегда забываю это делать.

python -c "import crypt, getpass, pwd; print crypt.crypt(raw_input(), '\$6\$' + raw_input() + '\$')"

2
Вы также можете настроить, bashчтобы не записывать команды с префиксом, добавляя HISTCONTROL=ignorespaceк вашему .bashrcфайлу пробел . Когда вы запускаете команду, которую хотите исключить из своей истории, просто введите пробел, а затем саму команду.
theillien

1

sha512 htpasswd

Команда, которая запрашивает имя пользователя и пароль и генерирует обычный htpasswd-файл:

python -c 'import crypt,getpass; print(getpass.getpass("Name: ")+":"+crypt.crypt(getpass.getpass(),crypt.mksalt(crypt.METHOD_SHA512)))' >> htpasswd

Работает со всеми версиями Python> 2.5.



0

Если вы используете метод Python (> = 2.7) из ответа сима и хотите подтвердить свой пароль до того, как он сгенерируется - потому что вы толстые пароли пальцев ...

$ python -c 'import crypt,getpass;pw=getpass.getpass(); print(crypt.crypt(pw), crypt.mksalt(crypt.METHOD_SHA512) if (pw==getpass.getpass("Confirm: ")) else exit())'

В версии этого ответа от 29 ноября 2017 г. говорится, что это работает для Python 2.7 (или более поздней версии). Модуль crypt в python2.7 не имеет mksalt (). Также я думаю, что вы хотите вызвать crypt.mksalt () как 2-й аргумент для crypt.crypt () (неуместное закрытие парен?).
Хуан

0

Версия openssl «OpenSSL 1.1.1» для Linux и версия openssl «LibreSSL 2.6.5» для MacOS с поддержкой md5_crypt.

Просто запустите и введите пароль:

openssl passwd -crypt
Password:
Verifying - Password:
<results_into_a_md5_crypt_password>

или предоставьте простой текстовый пароль непосредственно в CLI:

openssl password -crypt <plain_text_password_goes_here>
<results_into_a_md5_crypt_password>

-12

Вы можете использовать sha512sum:

echo "password" | sha512sum

24
Этот ответ неверен. Команда не будет генерировать действительный хэш пароля SHA-512 . Он просто вычислит контрольную сумму пароля строки \ n (обратите внимание, что в конце также есть новая строка). Хеши паролей Unix соленые и содержат код версии хеша между двумя символами «$». Смотрите ответ по @slm.
Зорлем

Более конкретно, проблема в том, что хотя пароль несколько запутан, этот метод уязвим для атаки en.wikipedia.org/wiki/Rainbow_table .
ДепрессияДаниэль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.