Jak utworzyć hashowane hasło SHA-512 dla cienia?

62

Poprzednie pytania SF, które widziałem, doprowadziły do ​​odpowiedzi, które produkują hashowane hasło MD5.

Czy ktoś ma jakieś sugestie, aby stworzyć hashowane hasło SHA-512? Wolałbym jeden linijkę zamiast skryptu, ale jeśli skrypt jest jedynym rozwiązaniem, to też dobrze.

Aktualizacja

Zastępowanie poprzednich wersji py2 tą:

python3 -c "import crypt;print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"
Belmin Fernandez
źródło
4
SHA i MD5 nie są szyfrowaniem. Są algorytmami mieszającymi. Zasadniczą różnicą jest to, że zaszyfrowanych danych nie można odzyskać. Co musisz zrobić?
SmallClanger,
Dziękuję Ci. Zmodyfikowałem pytanie. man 5 shadownazywa to „szyfrowanym hasłem”, więc zgodziłem się z tym terminem.
Belmin Fernandez,
2
Przepraszam, jeśli to było trochę ponure. Czy próbujesz ręcznie wygenerować skróty haseł zgodne z cieniem? Jeśli tak, spójrz na swoją /etc/shadowzawartość. Zobaczysz $x$salt$hash. xoznacza używany przez niego algorytm crypt, który 6jest typowy dla współczesnych linuksów, którym jest sha512 (patrz man 3 crypt). Każda z poniższych odpowiedzi spowoduje wygenerowanie tego samego skrótu, o ile podasz mu tę samą sól.
SmallClanger,
2
O nie, wcale nie snarky. Wyjaśniłeś mi coś, co mnie zdezorientowało, więc jestem bardzo wdzięczny, proszę pana!
Belmin Fernandez
1
Dziękuję Ci! Oparty na passlib jest jedynym, który mogłem pracować na OS X.
Stig Brautaset

Odpowiedzi:

65

Oto jeden liniowiec:

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

Python 3.3+ zawiera mksaltw krypcie , która sprawia, że znacznie łatwiej (i bardziej bezpieczne) do wykorzystania:

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

Jeśli nie stanowią argumentu crypt.mksalt(może to zaakceptować crypt.METHOD_CRYPT, ...MD5, SHA256, i SHA512), to użyje najsilniejszy dostępny.

Identyfikator skrótu (liczba po pierwszej $) jest powiązany z zastosowaną metodą:

  • 1 -> MD5
  • 2a -> Blowfish (nie w glibc mainline; dodano w niektórych dystrybucjach Linuksa)
  • 5 -> SHA-256 (od glibc 2.7)
  • 6 -> SHA-512 (od glibc 2.7)

Polecam sprawdzić, jakie są sole i takie, i jak dla drobnych pisarzy komentują różnicę między szyfrowaniem a haszowaniem.

Aktualizacja 1: Wytworzony ciąg jest odpowiedni dla skryptów shadow i kickstart. Aktualizacja 2: Ostrzeżenie. Jeśli używasz komputera Mac, zapoznaj się z komentarzem na temat używania tego w pythonie na komputerze Mac, gdzie nie działa ono zgodnie z oczekiwaniami.

davey
źródło
5
Zamień random_saltna rzeczywistą losową sól.
Belmin Fernandez
6
Nie mogę tego zmusić do pracy w Yosemite. Oto, co wyrzuca: $6asQOJRqB1i2- nie wydaje się to wystarczająco długie, aby było poprawne!
Stig Brautaset
3
Pozwól modułowi krypty zrobić dla ciebie sól: python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
rrauenza
2
glibc domyślnie używa tylko 5000 rund, co jest obecnie dość słabe. Można określić liczbę rund, dodając „$ rund = ###”, na przykład: crypt.crypt("test", "$6$rounds=200000$random_salt"). 200000 zajmuje około 100 ms na moim obecnym laptopie.
srparish
2
Nie należy tego używać, przynajmniej na komputerze Mac. Na komputerze Mac (10.13.5) za każdym razem zwraca ten sam niepoprawny wynik.
oskarpearson
37

W Debianie możesz używać mkpasswd do tworzenia haseł za pomocą różnych algorytmów mieszających odpowiednich dla / etc / shadow. Jest zawarty w pakiecie whois (zgodnie z plikiem apt)

mkpasswd -m sha-512
mkpasswd -m md5

aby uzyskać listę dostępnych algorytmów mieszających:

mkpasswd -m help 

HTH

mrossi
źródło
3
Jaki pakiet to zapewnia? mkpasswdPod Fedorą jest także program (część oczekiwań), ale do tego celu jest bezużyteczny.
Cristian Ciupitu
Jak powiedział, wersja, o mkpasswdktórej mówi, jest przeznaczona dla Debiana / Ubuntu. W mkpasswdFedorze (przynajmniej do 14) brakuje -mprzełącznika.
slm
3
Co ciekawe, jest to pakiet whois, dziedzictwo Debiana. Zobacz, dpkg -S /usr/bin/mkpasswdnie mogłem w to uwierzyć: D
Rbjz
Aby sprawdzić hasło, jeśli pierwsza cyfra to 6, użyj części między drugim a trzecim dolarem jako soli. Na przykład dla root:$6$AbCdE$xyz:...powinieneś użyć: mkpasswd -m sha-512 -S AbCdE. Przy poprawnym haśle powinieneś uzyskać ten sam skrót.
Luc
24

Najlepsza odpowiedź: 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
źródło
1
Proste rozwiązanie .. pracował dla mnie na CentOS 6.
Banjer
4
W systemach, które mają takie grub-cryptpolecenie, jest to naprawdę najbardziej niezawodny i wygodny sposób na zrobienie tego. Nie ma sensu bawić się solami ręcznie, gdy można to zepsuć. Problem polega na tym, że coraz bardziej nowoczesne systemy mają GRUB2 i dlatego nie będą zawierać tego polecenia.
rsaw
11

Oto krótki kod C do wygenerowania hasła SHA-512 w różnych systemach operacyjnych typu Unix.

Plik: 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;
}

kompilować:

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

stosowanie:

passwd-sha512 <password> <salt (16 chars max)>
BoogieBug
źródło
To pytanie ma 3 lata ...
Grumpy
Ten komentarz nie jest taki stary. Ładna aplikacja, którą tam masz, to tylko
jedna
4

Jednoliniowe rozwiązanie Perla do generowania zaszyfrowanego hasła SHA-512:

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

Pracował na RHEL 6

Ivan Chau
źródło
2

Dlaczego nie wykonać poniższej kontroli i modyfikacji na maszynach Centos / RHEL, aby upewnić się, że wszystkie skróty haseł dla / etc / shadow są wykonywane za pomocą sha512. Następnie możesz po prostu ustawić swój passworkd normalnie za pomocą polecenia 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
źródło
2

Oto jednowierszowy, który używa poleceń powłoki do utworzenia haszowanego hasła SHA-512 z losową solą:

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

Notatki

  1. Może być konieczne zainstalowanie pakietu „whois” (Debian, SuSE itp.), Który udostępnia „mkpasswd”.
  2. Zobacz crypt (3), aby uzyskać szczegółowe informacje na temat formatu linii w „/ etc / shadow”.
ajchace
źródło
Niestety whoispakiet z Fedory 18 nie zapewnia żadnych mkpasswd.
Cristian Ciupitu
1
W Arch Linux: / usr / bin / mkpasswd jest własnością firmy expect 5.45-3
Nowaker
To samo na Fedorze 20 i robi coś innego.
Cristian Ciupitu
2
Niestety sugerowane polecenie ma dwa problemy: 1) Podane hasło jest teraz przechowywane w historii powłoki i jest widoczne dla każdego, kto ma polecenie „historia” lub podobne. 2) Nie musisz podawać losowej soli w wierszu poleceń - i myślę, że powinieneś pozwolić mkpasswd zrobić to za ciebie, zamiast używać funkowych sztuczek opensl. (Zauważ, że dotyczy to przynajmniej Ubuntu Quantal. Możesz to przetestować, uruchamiając wielokrotnie „mkpasswd -m sha-512 foo”. Zobaczysz zmiany soli. Sól jest wartością między znakami 2 i 3 $. )
oskarpearson
2

Przeczytaj komentarz poniżej, aby dowiedzieć się o konsekwencjach bezpieczeństwa dla tej odpowiedzi

Dla osób myślących w języku Ruby tutaj jest liniowiec:

'password'.crypt('$6$' + rand(36 ** 8).to_s(36))
TrueDuality
źródło
1
Jest to niepoprawne: funkcja rand Ruby nie jest bezpieczna - używa PRNG, więc wygeneruje wyniki, które można poddać inżynierii wstecznej na podstawie domysłów czasu / stanu w chwili uruchomienia tego.
oskarpearson
1

Ten skrypt działał dla mnie na 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

Ma następujące funkcje, których brakuje niektórym innym alternatywom:

  • Wytwarza swoją sól bezpiecznie. Nikt nie powinien polegać na robieniu tego ręcznie. Zawsze.
  • nie przechowuje niczego w historii powłok.
  • dla jasności drukuje wygenerowane hasło użytkownika, co może być przydatne przy generowaniu haseł wielu użytkowników.
Ztyx
źródło
2
Uwaga: zadziała to tylko wtedy, gdy masz chpasswdw systemie.
Matt Sanders,
Do Twojej wiadomości: chpasswd nie obsługuje -S w shadow-utils-4.1.5.1
Saustrup
0

Algogramy HASH służą do tworzenia skrótów MESSAGE, nigdy nie nadają się do haseł, które powinny używać pewnego rodzaju HKDF ( http://tools.ietf.org/rfc/rfc5869.txt ) - patrz PBKDF2 lub BCrypt

Chris
źródło
Dobra uwaga, ale man cryptmówi mi, że PBKDF2 nie jest obsługiwany.
Huygens
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

Możesz sklonować go z mojego repozytorium github, jeśli chcesz: https://github.com/antoncohen/mksha

Anton Cohen
źródło
0

To nie jest jeden liniowiec, ale może pomóc komuś:

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
źródło
randomnie jest kryptograficznie bezpieczny, os.urandomnależy go użyć. Również 8 znaków ze słownika o długości 56 znaków jest zdecydowanie za mało. Łączenie żądła w kółko w pythonie jest również złą formą (ma złożoność O (n ^ 2))
Hubert Kario
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

Oczywiście, po prostu chwytasz drugie pole i możesz usunąć plik po dodaniu go do cienia lub do użycia z sudo (nadal najprawdopodobniej cień).

Joshua Gies
źródło
0

Spójrz na stronę podręcznika crypt (3) i myślę, że przekonasz się, że narzędzie do szyfrowania zostało zaktualizowane i używa glibc i sha256 (5 $) i sha512 (6 $), wielu rund, znacznie większej soli i tak dalej .

Najwyraźniej SHA512 ma znaczenie dla działania / etc / shadow.

To powiedziawszy, ta strona była bardzo pomocna - w szczególności MKPASSWD, ponieważ to rozwiązało MÓJ problem.

Biorąc pod uwagę potencjalnie „utracone” hasło, mogę użyć MKPASSWD i soli, aby wygenerować skrót SHA512 i potwierdzić / odrzucić listę haseł kandydujących.

Użyłbym rozpruwacza Johna - ale przynajmniej na moim sprzęcie (Raspberry Pi) i moim budżecie (nic) - John nie może tego zrobić (wydaje się, że nie obsługuje zaawansowanych funkcji crypt / glibc w darmowej wersji dla Raspbian).

Pamiętajcie, ponieważ mam wystarczające uprawnienia do czytania / pisania / etc / shadow, MOGĘ po prostu nadpisać skrót i kontynuować życie ... jest to ćwiczenie akademickie.


UWAGI Uwagi Glibc Wersja tej funkcji glibc2 obsługuje dodatkowe algorytmy szyfrowania.

   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
źródło
0

Jeśli potrzebujesz alternatywy dla jednowierszowych napisanych w perl / python, mkpasswd jest dobrym rozwiązaniem. Chociaż jest zawarty w pakiecie Whois Debiana, brakuje go w systemach CentOS / RHEL. Zmodyfikowałem wersję Debiana mkpasswd i dodałem silniejszy mechanizm generowania soli oparty na OpenSSL. Wynikowy plik binarny w pełni zachowuje wszystkie parametry wiersza poleceń wersji Debiana. Kod jest dostępny na githubie i powinien zostać skompilowany w dowolnym systemie Linux: mkpasswd

Liviu
źródło
-4

Nie jestem pewien, w jaki sposób związany jest SHA-512 /etc/shadow. Te hasła są cryptedytowane.

Ale jeśli chcesz zaszyfrować hasło za pomocą SHA-512, możesz to zrobić przez echo -n the_password | sha512sum. Nie możesz użyć danych wyjściowych dla / etc / shadow.

mailq
źródło
2
echo -n the_passwordwięc nie haszujesz nowej linii. </pedant>
SmallClanger,
Hasła shadownie są już szyfrowane () od lat. Nowoczesne systemy używają co najmniej md5.
Alexander Janssen
6
W rzeczywistości hasła w shadowdalszym ciągu są crypt()edytowane, ale funkcja została zaktualizowana w celu obsługi kilku różnych algorytmów. Niezależnie od tego metoda opisana w tej odpowiedzi nie wytwarza odpowiedniego skrótu /etc/shadow. Algorytm jest bardziej złożony niż pojedyncza runda skrótu SHA-512.
snap