Как создать хешированный пароль SHA-512 для тени?

62

Предыдущие вопросы SF, которые я видел, привели к ответам, которые дают хешированный пароль MD5

У кого-нибудь есть предложения по созданию хешированного пароля SHA-512? Я предпочел бы один вкладыш вместо сценария, но, если сценарий является единственным решением, это тоже хорошо.

Обновить

Замена предыдущих версий py2 на эту:

python3 -c "import crypt;print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"
Бельмин Фернандес
источник
4
SHA и MD5 не являются шифрованием. Они алгоритмы хеширования. Принципиальным отличием является то, что хешированные данные не подлежат восстановлению. Что тебе нужно сделать?
SmallClanger
Спасибо. Модифицировал вопрос. man 5 shadowназывает его «зашифрованным паролем», поэтому я согласился с этим термином.
Бельмин Фернандес
2
Извинения, если это было немного язвительным. Вы пытаетесь вручную создать теневые пароли? Если это так, взгляните на свое /etc/shadowсодержимое. Вы увидите $x$salt$hash. xОбозначает используемый алгоритм crypt, 6типичный для современных Linux, который называется sha512 (см. man 3 crypt). Любой из приведенных ниже ответов даст одинаковый хеш, если вы дадите ему одинаковую соль.
SmallClanger
2
О нет, совсем не скупо. Вы разъяснили кое-что, что я запутал, поэтому я очень благодарен, сэр!
Бельмин Фернандес
1
Спасибо! Основанный на passlib - единственный, кому я смог сделать работу на OS X.
Стиг Браутасет

Ответы:

65

Вот один вкладыш:

python -c 'import crypt; print crypt.crypt("test", "$6$random_salt")'

Python 3.3+ включает mksaltв себя crypt , что значительно упрощает (и делает его более безопасным) использование:

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

Если вы не предоставите аргумент , чтобы crypt.mksalt(он мог принять crypt.METHOD_CRYPT, ...MD5, SHA256, и SHA512), он будет использовать самый сильный доступный.

Идентификатор хэша (число после первого $) связан с используемым методом:

  • 1 -> MD5
  • 2a -> Blowfish (отсутствует в mainline glibc; добавлено в некоторые дистрибутивы Linux)
  • 5 -> SHA-256 (начиная с glibc 2.7)
  • 6 -> SHA-512 (начиная с версии 2.7)

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

Обновление 1: созданная строка подходит для сценариев shadow и kickstart. Обновление 2: Предупреждение. Если вы используете Mac, посмотрите комментарий об использовании этого в python на Mac, где он не работает должным образом.

Davey
источник
5
Заменить random_saltфактической случайной солью.
Бельмин Фернандес
6
Я не могу заставить это работать в Йосемити. Это то, что он выплевывает: $6asQOJRqB1i2- это не кажется достаточно длинным, чтобы быть правильным!
Стиг Браутасет
3
Пусть модуль склепа приготовит для вас соль: python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
rrauenza
2
По умолчанию glibc использует только 5000 раундов, что в наши дни довольно слабое. Вы можете указать количество раундов, добавив «$ раундов = ###», например: crypt.crypt("test", "$6$rounds=200000$random_salt"). 200000 занимает около 100 мс на моем текущем ноутбуке.
srparish
2
Это не должно использоваться, по крайней мере, на Mac. На Mac (10.13.5) каждый раз возвращается один и тот же неверный результат.
oskarpearson
37

В Debian вы можете использовать mkpasswd для создания паролей с разными алгоритмами хеширования, подходящими для / etc / shadow. В комплект входит whois (согласно apt-файлу)

mkpasswd -m sha-512
mkpasswd -m md5

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

mkpasswd -m help 

НТН

mrossi
источник
3
Какой пакет это обеспечивает? mkpasswdПод Fedora тоже есть программа (часть ожидаемого), но для этой цели она бесполезна.
Кристиан Чиупиту
По его словам, версия, о которой mkpasswdон говорит, предназначена для Debian / Ubuntu. На mkpasswdFedora (по крайней мере, до 14) отсутствует -mпереключатель.
СЛМ
3
Любопытно, что это пакет whois, унаследованный от Debian. Видите, dpkg -S /usr/bin/mkpasswdя сам не мог в это поверить: D
Rbjz
Чтобы проверить пароль, если первая цифра - 6, используйте часть между вторым и третьим долларом как соль. Например для root:$6$AbCdE$xyz:...следует использовать: mkpasswd -m sha-512 -S AbCdE. С правильным паролем вы должны получить тот же хеш.
Люк
24

Лучший ответ: grub-crypt

Usage: grub-crypt [OPTION]...
Encrypt a password.

-h, --helpPrint this message and exit
-v, --version           Print the version information and exit
--md5                   Use MD5 to encrypt the password
--sha-256               Use SHA-256 to encrypt the password
**--sha-512             Use SHA-512 to encrypt the password (default)**
Wayne
источник
1
Простое решение ..
сработало
4
В системах, которые имеют grub-cryptкоманду, это действительно самый надежный и удобный способ сделать это. Нет смысла играть с солями вручную, когда ты можешь это испортить. Проблема в том, что все больше и больше современных систем имеют GRUB2 и поэтому не будут включать эту команду.
выслать
11

Вот краткий C-код для генерации пароля SHA-512 в различных ОС Unix.

Файл: passwd-sha512.c

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  if ( argc < 3 || (int) strlen(argv[2]) > 16 ) {
    printf("usage: %s password salt\n", argv[0]);
    printf("--salt must not larger than 16 characters\n");
    return;
  }

  char salt[21];
  sprintf(salt, "$6$%s$", argv[2]);

  printf("%s\n", crypt((char*) argv[1], (char*) salt));
  return;
}

Скомпилировать:

/usr/bin/gcc -lcrypt -o passwd-sha512 passwd-sha512.c

использование:

passwd-sha512 <password> <salt (16 chars max)>
BoogieBug
источник
Этому вопросу 3 года ...
Сердитый
Этот комментарий не так уж и стар. Милое приложение, которое вы там получили, это только c ответом 1up, даже если оно выглядит как пример с man-страницей :)
Sampo Sarrala
4

Однострочное решение Perl для создания хешированного пароля SHA-512:

perl -le 'print crypt "desiredPassword", "\$6\$customSalt\$"'

Работал на RHEL 6

Иван Чау
источник
2

Почему бы не выполнить следующую проверку и модификацию машин Centos / RHEL, чтобы убедиться, что все хэши паролей для / etc / shadow выполняются с помощью sha512. Тогда вы можете просто установить ваш passworkd с помощью команды passwd

#Set stronger password hasing
/usr/sbin/authconfig --test | grep sha512 > /dev/null
if [ $? -ne 0 ]; then
echo "Configuring sha512 password hashing"
sudo /usr/sbin/authconfig --enableshadow --passalgo=sha512 --updateall
fi
ckliborn
источник
2

Вот строка, в которой используются команды оболочки для создания хэшированного пароля SHA-512 со случайной солью:

[root @ host] mkpasswd -m sha-512 MyPAsSwOrD $ (openssl rand -base64 16 | tr -d '+ =' | head -c 16)

Примечания

  1. Вам может потребоваться установить пакет whois (Debian, SuSE и т. Д.), Который предоставляет mkpasswd.
  2. Смотрите crypt (3) для подробностей о формате строк в "/ etc / shadow".
ajchace
источник
К сожалению, whoisпакет из Fedora 18 не предоставляет mkpasswd.
Кристиан Чиупиту
1
В Arch Linux: / usr / bin / mkpasswd принадлежит ожидаемой версии 5.45-3
Nowaker,
То же самое на Fedora 20, и он делает что-то еще.
Кристиан Чиупиту
2
К сожалению, предложенная команда имеет две проблемы: 1) Предоставленный пароль теперь хранится в истории вашей оболочки и виден любому, у кого есть команда «history» или аналогичная. 2) Вам не нужно указывать случайную соль в командной строке - и я думаю, что вы должны позволить mkpasswd сделать это за вас, вместо того, чтобы использовать прикольные трюки openssl. (Обратите внимание, что это верно, по крайней мере, в Ubuntu Quantal. Вы можете проверить это, запустив 'mkpasswd -m sha-512 foo' несколько раз. Вы увидите изменения соли. Соль - это значение между 2-м и 3-м символами $. )
oskarpearson
2

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

Для тех, кто настроен на Ruby, вот одна строка:

'password'.crypt('$6$' + rand(36 ** 8).to_s(36))
TrueDuality
источник
1
Это неверно: функция rand в Ruby небезопасна - она ​​использует PRNG, поэтому она будет генерировать результаты, которые могут быть подвергнуты обратному проектированию на основе предположения о времени / состоянии момента, когда вы запустили это.
oskarpearson
1

Этот скрипт работал для меня в Ubuntu 12.04 LTS: https://gist.github.com/JensRantil/ac691a4854a4f6cb4bd9

#!/bin/bash
read -p "Enter username: " username
read -s -p "Enter password: " mypassword
echo
echo -n $username:$mypassword | chpasswd -S -c SHA512

Он имеет следующие особенности, которых нет в некоторых других альтернативах:

  • Он генерирует свою соль безопасно. Никто не должен полагаться на это вручную. Когда-либо.
  • он не хранит ничего в истории оболочки.
  • для ясности он печатает, какой пароль пользователя он сгенерировал, что может быть удобно при создании паролей многих пользователей.
Ztyx
источник
2
Обратите внимание, что это будет работать, только если у вас есть chpasswdв вашей системе.
Мэтт Сандерс
К вашему сведению: chpasswd не поддерживает -S в shadow-utils-4.1.5.1
Saustrup
0

Алгоритмы HASH предназначены для создания дайджестов MESSAGE, они никогда не подходят для паролей, которые должны использовать какой-то HKDF ( http://tools.ietf.org/rfc/rfc5869.txt ) - см. PBKDF2 или BCrypt

Крис
источник
Хороший вопрос, но man cryptговорит мне, что PBKDF2 не поддерживается.
Гюйгенс,
0
#!/usr/bin/env python

import getpass

from passlib.hash import sha512_crypt

if __name__ == "__main__":
    passwd = getpass.getpass('Password to hash: ')
    hash = sha512_crypt.encrypt(passwd)

    print hash

Вы можете клонировать его из моего репозитория github, если хотите: https://github.com/antoncohen/mksha

Антон Коэн
источник
0

Это не один лайнер, но это может помочь кому-то:

import crypt, getpass, pwd, string, sys, random
randomsalt = ""
password = getpass.getpass()
choices = string.ascii_uppercase + string.digits + string.ascii_lowercase
for _ in range(0,8):
    randomsalt += random.choice(choices)
print crypt.crypt(password, '$6$%s$' % randomsalt)
jordixou
источник
randomне криптографически безопасен, os.urandomдолжен использоваться. 8 символов из 56-символьного словаря тоже слишком мало. Конкатенация жала снова и снова в python тоже плохая форма (она имеет сложность O (n ^ 2))
Hubert
0
$ htpasswd -c /tmp/my_hash user1
New password: 
Re-type new password: 
Adding password for user user1
$ cat /tmp/my_hash
user1:$apr1$oj1ypcQz$4.6lFVtKz2nr8acsQ8hD30

Очевидно, что вы просто захватываете 2-е поле и можете удалить файл, как только добавите его в shadow или для использования с sudo (по-прежнему наиболее вероятно shadow).

Джошуа Гис
источник
0

Взгляните на справочную страницу для crypt (3), и я думаю, что вы обнаружите, что инструмент crypt был обновлен для использования glibc и sha256 (5 долларов) и sha512 (6 долларов), многократных раундов, гораздо большей соли и т. Д. ,

Очевидно, что SHA512 относится к тому, как работает / etc / shadow.

Тем не менее, эта веб-страница была очень полезной - в частности, MKPASSWD, так как это решило мою проблему.

Учитывая потенциально «потерянный» пароль, я могу использовать MKPASSWD и соль для генерации хэша SHA512 и подтверждения / отклонения списка возможных паролей.

Я бы использовал Джона Потрошителя - но, по крайней мере, на моем оборудовании (Raspberry Pi) и моем бюджете (ничего) - Джон не может этого сделать (кажется, что он не поддерживает расширенные функции crypt / glibc в бесплатной версии raspbian.

Имейте в виду, поскольку у меня достаточно разрешений на чтение / запись / etc / shadow, я МОГУ просто перезаписать хеш и продолжить жизнь ... это академическое упражнение.


ПРИМЕЧАНИЯ Примечания Glibc Версия этой функции для glibc2 поддерживает дополнительные алгоритмы шифрования.

   If salt is a  character  string  starting  with  the  characters
   "$id$" followed by a string terminated by "$":

          $id$salt$encrypted

   then instead of using the DES machine, id identifies the encryp‐
   tion method used and this then determines how the  rest  of  the
   password  string is interpreted.  The following values of id are
   supported:

          ID  | Method
          ─────────────────────────────────────────────────────────
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)
          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

   So  $5$salt$encrypted  is  an  SHA-256  encoded   password   and
   $6$salt$encrypted is an SHA-512 encoded one.
joeomniback
источник
0

Если вам нужна альтернатива однострочным текстам, написанным на perl / python, mkpasswd подойдет. Хотя он включен в пакет Whois Debian, он отсутствует в системах CentOS / RHEL. Я изменил версию mkpasswd для Debian и включил более мощный механизм генерации соли, основанный на OpenSSL. Полученный двоичный файл полностью сохраняет все параметры командной строки версии Debian. Код доступен на github и должен компилироваться на любой вкус Linux: mkpasswd

Ливиу
источник
-4

Я не уверен, как SHA-512 связан с /etc/shadow. Эти пароли cryptред.

Но если вы хотите, чтобы с помощью SHA-512 хешировали пароль, вы можете сделать это с помощью echo -n the_password | sha512sum. Вы не можете использовать вывод для / etc / shadow.

mailq
источник
2
echo -n the_passwordтак что вы не хэшируете новую строку. </
pedant
Пароли в shadowуже не crypt () с годами. Современные системы используют как минимум md5.
Александр Янссен
6
На самом деле пароли shadowвсе еще crypt()редактируются, но функция была обновлена ​​для поддержки нескольких различных алгоритмов. Несмотря на это, метод, описанный в этом ответе, не создает подходящий хеш для /etc/shadow. Алгоритм является более сложным, чем один хэш-цикл SHA-512.
оснастка