Jak utworzyć skrót hasłowy SHA512 w wierszu poleceń


83

W systemie Linux mogę utworzyć skrót hasłowy SHA1 przy użyciu sha1pass mypassword. Czy istnieje podobne narzędzie wiersza poleceń, które pozwala mi tworzyć sha512skróty? To samo pytanie dla Bcrypti PBKDF2.


Nie masz na myśli sha1sum?

1
@Tichodroma nie, tak naprawdę istnieje sha1passpolecenie będące częścią pakietu syslinux-common w Debianie.
derobert

2
Istnieje sha512sumpolecenie, które jest częścią coreutils i podobnie openssl sha512- ale nie robi to również dodatkowa funkcja sha1pass.
Keith Thompson

Odpowiedzi:


55

Tak, szukasz mkpasswd, która (przynajmniej na Debianie) jest częścią whoispakietu. Nie pytaj dlaczego ...

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

Niestety moja wersja przynajmniej nie obsługuje bcrypt. Jeśli twoja biblioteka C ma, to powinna (a strona podręczna daje opcję -R, aby ustawić siłę). -R działa również na sha-512, ale nie jestem pewien, czy to PBKDF-2, czy nie.

Jeśli potrzebujesz wygenerować hasło bcrypt, możesz to zrobić uczciwie po prostu za pomocą Crypt::Eksblowfish::Bcryptmodułu Perl.


70

W żadnej dystrybucji systemu Red Hat, takiej jak Fedora, CentOS lub RHEL, polecenie mkpasswdnie zawiera tego samego zestawu przełączników, co wersja zwykle dołączana do Debian / Ubuntu.

UWAGA: Komenda mkpasswdjest w rzeczywistości częścią expectpakietu i prawdopodobnie należy jej unikać. Możesz dowiedzieć się, do którego pakietu należy, używając jednego z tych poleceń.

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

Przykład

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

Obie te metody są lepsze niż używanie, rpmponieważ nie trzeba instalować pakietów, aby je zlokalizować */mkpasswd.

Obejścia

Aby obejść ten problem, możesz użyć następujących linijek Python lub Perl do wygenerowania haseł SHA-512. Zwróć uwagę, że są one solone:

Python (> = 3.3)

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

lub skrypty

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

Python (2.x lub 3.x)

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

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

Uwaga: 6 $ oznacza sha512. Obsługa tej metody określania algorytmu zależy od obsługi funkcji biblioteki crypt (3) na poziomie systemu operacyjnego (zwykle w libcrypt). Nie zależy od wersji Pythona.

Perl

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

W tych przykładach hasło jest ciągiem „hasło”, a solą jest „saltalt”. Oba przykłady używają 6 $, co oznacza, że ​​chcesz używać krypt SHA-512.


2
W przypadku liniowej linii python możesz użyć crypt.mksalt(crypt.METHOD_SHA512)do wygenerowania soli zamiast używać stałej.
Jake Cobb,

2
@JakeCobb crypt.mksaltjest dostępny tylko w Pythonie 3.x
Riccardo Murri

2
Przed wpisaniem hasła w postaci jawnego tekstu w wierszu polecenia upewnij się, że w HISTCONTROL jest ustawione „ignorowanie” (tj. Zrób to najpierw w CentOS / RHEL: echo 'export HISTCONTROL = „ignoredups: ignorespace”'> /etc/profile.d /histcontrol.sh && source /etc/profile.d/histcontrol.sh). W przeciwnym razie zostanie zapisany w twojej ~ / .bash_history.
Patrick

3
perl (i prawdopodobnie python) używa funkcji systemowej „crypt”. Nie są więc przenośne, wymagają funkcji szyfrowania, która rozpoznaje żądany typ skrótu. Krypt OSX nie - po prostu zwraca mi stary ciąg szyfrowany DES.
Dan Pritts,

1
@RiccardoMurri Mam Python 2.7.5 i mam dostęp do crypt.mksaltCentOS 7.1
user12345

15

Możesz użyć doveadmnarzędzia, które jest zawarte w dovecotpakiecie.

doveadm pw -s SHA512-CRYPT

Przykład wyniku:

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

Po prostu wytnij {SHA512-CRYPT}, a otrzymasz swój haszowany łańcuch SHA512.


Nie działa dla mnie jako zwykłego użytkownika: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

Uruchom to polecenie:

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

następnie wprowadź słowo, które chcesz zaszyfrować.


-bash: / sbin / grub-crypt: Brak takiego pliku lub katalogu
Czy Sheppard

Nie wierzę, że grub jest na c7, więc możesz użyć: python -c 'import crypt, getpass; print (crypt.crypt (getpass.getpass (), crypt.mksalt (crypt.METHOD_SHA512))))
ucemike

3

Aby rozwinąć powyższe obejścia @ slm, jeśli martwisz się, że ktoś zapozna się z twoją historią basha i zobaczysz hasło w postaci zwykłego tekstu, możesz wstawić raw_input()w python instrukcji, gdzie idą pola soli i hasła, aby wyświetlał monit o podanie hasła. Tekst nie jest maskowany podczas pisania, ale nie pojawi się w historii bash. Możesz także uruchomić polecenie z wiodącym odstępem, ale zawsze o tym zapominam.

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

2
Możesz także skonfigurować, bashaby nie zapisywać poleceń poprzedzonych spacją dodającą HISTCONTROL=ignorespacedo .bashrcpliku. Po uruchomieniu polecenia, które chcesz wykluczyć z historii, po prostu wpisz spację, a następnie polecenie.
theillien

1

sha512 htpasswd

Polecenie, które prosi użytkownika i hasło i generuje zwykły plik htpasswd:

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

Działa ze wszystkimi wersjami Pythona> 2.5.


1

OpenSSL ma

openssl passwd -6

Pomoc mówi:

$ openssl passwd --help
Usage: passwd [options]
Valid options are:
...
 -6                  SHA512-based password algorithm

0

Jeśli używasz metody Python (> = 2.7) z odpowiedzi karty SIM i chcesz potwierdzić hasło przed wygenerowaniem - ponieważ hasła grubego palca ...

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

W wersji tej z 29 listopada 2017 r. Napisano, że działa to dla Pythona 2.7 (lub nowszego). Moduł krypt w python2.7 nie ma mksalt (). Myślę też, że chcesz, aby wywołanie crypt.mksalt () było drugim argumentem crypt.crypt () (zgubił się zamknięty paren?).
Juan

0

wersja openssl „OpenSSL 1.1.1” w systemie Linux i wersja openssl „LibreSSL 2.6.5” w systemie MacOS obsługuje md5_crypt.

Po prostu uruchom i wprowadź hasło:

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

lub podaj hasło w postaci zwykłego tekstu bezpośrednio do interfejsu CLI:

openssl password -crypt <plain_text_password_goes_here>
<results_into_a_md5_crypt_password>

-12

Możesz użyć sha512sum:

echo "password" | sha512sum

24
Ta odpowiedź jest niepoprawna. Polecenie nie wygeneruje poprawnego skrótu hasła SHA-512 . Po prostu obliczy sumę kontrolną hasła ciągu \ n (zwróć uwagę, że na końcu znajduje się również nowa linia). Hasła uniksowe są solone i zawierają kod wersji skrótu między dwoma symbolami „$”. Zobacz odpowiedź @slm.
zorlem

Mówiąc dokładniej, problem polega na tym, że choć hasło jest nieco zaciemnione, metoda ta jest podatna na atak en.wikipedia.org/wiki/Rainbow_table .
DepressedDaniel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.