Wie erstelle ich ein SHA-512-Hash-Passwort für shadow?

62

Die vorherigen SF-Fragen, die ich gesehen habe, haben zu Antworten geführt, die ein MD5-Hash-Passwort erzeugen.

Hat jemand einen Vorschlag zur Erstellung eines SHA-512-Hash-Passworts? Ich würde einen Einzeiler anstelle eines Skripts bevorzugen, aber wenn ein Skript die einzige Lösung ist, ist das auch in Ordnung.

Aktualisieren

Ersetzen früherer py2-Versionen durch diese:

python3 -c "import crypt;print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"
Belmin Fernandez
quelle
4
SHA und MD5 sind keine Verschlüsselung. Sie sind Hashalgorithmen. Der entscheidende Unterschied besteht darin, dass die gehashten Daten nicht wiederhergestellt werden können. Was musst du tun?
SmallClanger
Danke. Die Frage wurde geändert. man 5 shadowbezeichnet es als "verschlüsseltes Passwort", also stimmte ich diesem Begriff zu.
Belmin Fernandez
2
Entschuldigung, wenn das ein bisschen snarky war. Versuchen Sie, manuell Shadow-kompatible Kennwort-Hashes zu generieren? Wenn ja, werfen Sie einen Blick auf Ihre /etc/shadowInhalte. Du wirst sehen $x$salt$hash. xbezeichnet den Algorithmus von sha512 (siehe ) crypt, 6der für moderne Linux-Systeme typisch ist man 3 crypt. Bei jeder der folgenden Antworten wird derselbe Hash erzeugt, sofern Sie ihm dasselbe Salz geben.
SmallClanger
2
Oh nein, überhaupt nicht snarky. Sie haben etwas klargestellt, über das ich verwirrt war, und ich bin sehr dankbar, Sir!
Belmin Fernandez
1
Danke! Die Passlib-basierte Version ist die einzige, mit der ich unter OS X arbeiten konnte.
Stig Brautaset

Antworten:

65

Hier ist ein Einzeiler:

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

Python 3.3+ ist mksaltin crypt enthalten , wodurch die Verwendung wesentlich einfacher (und sicherer) wird:

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

Wenn Sie nicht ein Argument liefern , um crypt.mksalt(es akzeptieren könnte crypt.METHOD_CRYPT, ...MD5, SHA256, und SHA512), wird es die stärksten verfügbaren verwenden.

Die ID des Hash (Nummer nach der ersten $) hängt mit der verwendeten Methode zusammen:

  • 1 -> MD5
  • 2a -> Blowfish (nicht in mainline glibc; in einigen Linux Distributionen hinzugefügt)
  • 5 -> SHA-256 (seit glibc 2.7)
  • 6 -> SHA-512 (seit glibc 2.7)

Ich würde empfehlen, nachzuschlagen, was Salze und solche sind, und laut Smallclamgers den Unterschied zwischen Verschlüsselung und Hashing zu kommentieren.

Update 1: Der erzeugte String ist für Shadow- und Kickstart-Skripte geeignet. Update 2: Warnung. Wenn Sie einen Mac verwenden, lesen Sie den Kommentar zur Verwendung dieses Befehls in Python auf einem Mac, auf dem es nicht wie erwartet zu funktionieren scheint.

Davey
quelle
5
Ersetzen Sie random_saltmit einem tatsächlichen zufälligen Salz.
Belmin Fernandez
6
Ich kann das nicht in Yosemite zum Laufen bringen. Dies ist, was es ausspuckt: $6asQOJRqB1i2- das scheint nicht lange genug zu sein, um richtig zu sein!
Stig Brautaset
3
Lassen Sie das Krypta-Modul das Salz für Sie machen: python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
Rrauenza
2
Standardmäßig verwendet glibc nur 5000 Runden, was heutzutage ziemlich schwach ist. Sie können die Anzahl der Runden angeben , indem Sie „$ Runden = ###“, zum Beispiel das Hinzufügen: crypt.crypt("test", "$6$rounds=200000$random_salt"). 200000 dauert auf meinem aktuellen Laptop ungefähr 100 ms.
Srparish
2
Dies sollte zumindest auf einem Mac nicht verwendet werden. Auf einem Mac (10.13.5) wird jedes Mal dasselbe falsche Ergebnis zurückgegeben.
oskarpearson
37

Unter Debian können Sie mkpasswd verwenden , um Passwörter mit verschiedenen Hashing-Algorithmen zu erstellen, die für / etc / shadow geeignet sind. Es ist im Paket whois enthalten (laut apt-file)

mkpasswd -m sha-512
mkpasswd -m md5

Um eine Liste der verfügbaren Hashing-Algorithmen zu erhalten, geben Sie Folgendes ein:

mkpasswd -m help 

HTH

mrossi
quelle
3
Welches Paket bietet es? Es gibt auch ein mkpasswdProgramm unter Fedora, aber es ist für diesen Zweck nutzlos.
Cristian Ciupitu
Wie er sagte, ist die Version, von der mkpasswder spricht, für Debian / Ubuntu. Dem mkpasswdauf Fedora (mindestens bis zu 14) fehlt der -mSchalter.
Slm
3
Seltsamerweise ist es das whois-Paket, ein Vermächtnis von Debian. Siehe dpkg -S /usr/bin/mkpasswdich es selbst nicht glauben kann: D
Rbjz
Um ein Passwort zu überprüfen, verwenden Sie den Teil zwischen dem zweiten und dritten Dollar als Salt, wenn die erste Ziffer 6 ist. Zum Beispiel für die root:$6$AbCdE$xyz:...Sie verwenden sollen: mkpasswd -m sha-512 -S AbCdE. Mit dem richtigen Passwort sollten Sie den gleichen Hash erhalten.
Luc
24

Beste Antwort: Grub-Krypta

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
quelle
1
Einfache Lösung
.. funktionierte
4
Auf Systemen, die den grub-cryptBefehl haben, ist dies die einfachste und bequemste Möglichkeit, dies zu tun. Es macht keinen Sinn, manuell mit Salz herumzuspielen, wenn man es vermasseln könnte. Das Problem ist, dass immer mehr moderne Systeme GRUB2 haben und daher diesen Befehl nicht enthalten.
Rsaw
11

Hier ist ein kurzer C-Code zum Generieren des SHA-512-Kennworts unter verschiedenen Unix-Betriebssystemen.

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

kompilieren:

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

Verwendungszweck:

passwd-sha512 <password> <salt (16 chars max)>
BoogieBug
quelle
Diese Frage ist 3 Jahre alt ...
Grumpy
Dieser Kommentar ist nicht so alt. Süße App, die Sie dort haben, das ist nur c Antwort 1up, auch wenn es aussieht wie Manpage Beispiel :)
Sampo Sarrala
4

Perl One-Liner-Lösung zur Generierung von SHA-512-Hashing-Passwörtern:

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

Arbeitete an RHEL 6

Ivan Chau
quelle
2

Führen Sie die folgende Überprüfung und Änderung an Centos / RHEL-Computern durch, um sicherzustellen, dass alle Kennwort-Hashing-Vorgänge für / etc / shadow mit sha512 ausgeführt werden. Dann können Sie Ihr Passwort ganz normal mit dem Befehl passwd festlegen

#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
quelle
2

Hier ist ein Einzeiler, der Shell-Befehle verwendet, um ein SHA-512-Hash-Passwort mit einem zufälligen Salt zu erstellen:

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

Anmerkungen

  1. Möglicherweise müssen Sie das "whois" -Paket (Debian, SuSE usw.) installieren, das "mkpasswd" bereitstellt.
  2. Einzelheiten zum Format der Zeilen in "/ etc / shadow" finden Sie in crypt (3).
Ajchace
quelle
Leider enthält das whoisPaket von Fedora 18 keine mkpasswd.
Cristian Ciupitu
1
In Arch Linux: / usr / bin / mkpasswd wird von Expect 5.45-3
Nowaker
Dasselbe gilt für Fedora 20 und es macht etwas anderes.
Cristian Ciupitu
2
Leider weist der vorgeschlagene Befehl zwei Probleme auf: 1) Das angegebene Kennwort wird jetzt im Verlauf Ihrer Shell gespeichert und ist für alle Benutzer mit dem Befehl 'history' oder ähnlichem sichtbar. 2) Sie müssen das zufällige Salt nicht in der Befehlszeile eingeben - und ich denke, Sie sollten es mkpasswd überlassen, es für Sie zu tun, anstatt funky OpenSL-Tricks zu verwenden. (Beachten Sie, dass dies zumindest auf Ubuntu Quantal zutrifft. Sie können es testen, indem Sie 'mkpasswd -m sha-512 foo' mehrmals ausführen. Sie werden die Salt-Änderungen sehen. Das Salt ist der Wert zwischen dem 2. und 3. $ -Zeichen. )
oskarpearson
2

Lesen Sie den folgenden Kommentar, um mehr über die Auswirkungen dieser Antwort auf die Sicherheit zu erfahren

Für diejenigen, die an Ruby denken, ist hier ein Einzeiler:

'password'.crypt('$6$' + rand(36 ** 8).to_s(36))
TrueDuality
quelle
1
Dies ist falsch: Rubys Rand-Funktion ist nicht sicher - sie verwendet ein PRNG, sodass Ergebnisse generiert werden, die basierend auf der Schätzung des Zeitpunkts / Status, zu dem Sie dies ausgeführt haben, rückgängig gemacht werden können.
oskarpearson
1

Dieses Skript funktionierte für mich unter 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

Es hat die folgenden Eigenschaften, die einigen der anderen Alternativen fehlen:

  • Es erzeugt sein Salz sicher. Niemand sollte sich darauf verlassen, dies manuell zu tun. Je.
  • Es speichert nichts in der Shell-Geschichte.
  • Aus Gründen der Übersichtlichkeit wird gedruckt, welches Benutzerkennwort generiert wurde. Dies kann hilfreich sein, wenn die Kennwörter vieler Benutzer generiert werden.
Ztyx
quelle
2
Beachten Sie, dass dies nur funktioniert, wenn Sie chpasswdauf Ihrem System haben.
Matt Sanders
Zu Ihrer Information: chpasswd unterstützt -S in shadow-utils-4.1.5.1
Saustrup
0

HASH-Algen dienen zur Erstellung von MESSAGE-Digests. Sie sind niemals für Kennwörter geeignet, die eine Art HKDF ( http://tools.ietf.org/rfc/rfc5869.txt ) verwenden sollten - siehe PBKDF2 oder BCrypt

chris
quelle
Guter Punkt, aber man cryptsagt mir, dass PBKDF2 nicht unterstützt wird.
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

Sie können es von meinem Github-Repo klonen, wenn Sie möchten: https://github.com/antoncohen/mksha

Anton Cohen
quelle
0

Es ist kein Einzeiler, aber es könnte jemandem helfen:

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
quelle
randomist nicht kryptografisch sicher, os.urandomsollte verwendet werden. 8 Zeichen aus einem 56 Zeichen langen Wörterbuch sind viel zu wenig. Sich immer wieder auf einen Stich in Python einzulassen, ist ebenfalls eine schlechte Form (es hat eine O (n ^ 2) -Komplexität)
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

Natürlich greifen Sie einfach auf das zweite Feld zu und können die Datei löschen, sobald Sie sie zu shadow hinzugefügt haben oder für sudo verwenden (wahrscheinlich immer noch shadow).

Joshua Gies
quelle
0

Werfen Sie einen Blick auf die Manpage für Crypt (3) und ich denke, Sie werden feststellen, dass das Crypt-Tool so aktualisiert wurde, dass es glibc und sha256 ($ 5) und sha512 ($ 6), mehrere Runden, viel mehr Salt und so weiter verwendet .

Es ist klar, dass SHA512 für die Funktionsweise von / etc / shadow relevant ist.

Trotzdem war diese Webseite sehr hilfreich - insbesondere das MKPASSWD, da dies MEIN Problem löste.

Angesichts eines möglicherweise "verlorenen" Passworts kann ich MKPASSWD und das Salt verwenden, um den SHA512-Hash zu generieren und eine Liste von Kandidatenpasswörtern zu bestätigen / abzulehnen.

Ich würde John the Ripper verwenden - aber zumindest auf meiner Hardware (Raspberry Pi) und meinem Budget (nichts) - John kann das nicht (es scheint das fortgeschrittene Crypt / Glibc-Zeug in der raspbian-freien Version nicht zu unterstützen.

Allerdings, da ich genug Erlaubnis zum Lesen / Schreiben / etc / shadow habe, KÖNNTE ich den Hash einfach überschreiben und mit dem Leben weitermachen ... dies ist eine akademische Übung.


HINWEISE Glibc-Hinweise Die glibc2-Version dieser Funktion unterstützt zusätzliche Verschlüsselungsalgorithmen.

   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
quelle
0

Wenn Sie eine Alternative zu Einzeilern in Perl / Python benötigen, ist mkpasswd eine gute Ergänzung. Während es im Debian whois-Paket enthalten ist, fehlt es auf CentOS / RHEL-Systemen. Ich habe die Debian-Version von mkpasswd modifiziert und einen stärkeren Salzgenerierungsmechanismus auf Basis von OpenSSL eingebaut. Die resultierende Binärdatei behält alle Befehlszeilenparameter der Debian-Version vollständig bei. Der Code ist auf Github verfügbar und sollte auf jeder Linux- Variante kompiliert werden: mkpasswd

Liviu
quelle
-4

Ich bin nicht sicher, wie SHA-512 verwandt ist /etc/shadow. Diese Passwörter werden cryptbearbeitet.

Wenn Sie jedoch ein mit SHA-512 gehashtes Passwort möchten, können Sie dies folgendermaßen tun echo -n the_password | sha512sum. Sie können die Ausgabe für / etc / shadow nicht verwenden.

mailq
quelle
2
echo -n the_passwordSie haben also keine Zeilenumbrüche. </
pedant
Passwörter in shadowcrypt () werden seit Jahren nicht mehr bearbeitet. Moderne Systeme verwenden mindestens md5.
Alexander Janssen
6
Eigentlich sind die Passwörter in shadownoch nicht crypt()geändert, aber die Funktion wurde aktualisiert, um verschiedene Algorithmen zu unterstützen. Unabhängig davon liefert die in dieser Antwort beschriebene Methode keinen geeigneten Hash für /etc/shadow. Der Algorithmus ist komplexer als eine einzelne SHA-512-Hash-Runde.
Snap