Python-crypt-Modul — was ist die richtige Verwendung von Salzen?
Erste, Kontext: ich versuche, erstellen Sie ein command-line-tool (Linux),
Anmeldung erforderlich. Konten auf dieses tool nichts zu tun haben mit
system-level-Konten -- nichts, das sieht in /etc/passwd.
Ich bin der Planung zum speichern der Benutzer-Konten in einer text-Datei mit dem gleichen format (etwa) als /etc/passwd.
Trotz nicht mit der system-level-Passwort-Dateien, Verwendung von crypt schien
um eine gute Praxis zu verwenden, im Gegensatz zur Speicherung der Passwörter in
Klartext. (Während der Krypta ist sicherlich besser als das speichern der Passwörter in
Klartext, ich bin offen für andere Wege, dies zu tun.)
Meine crypt wissen basiert auf dieser:
https://docs.python.org/2/library/crypt.html
In der Dokumentation scheint zu Fragen, für etwas, das nicht möglich: "es
wird empfohlen, um die volle crypted password als Salz bei der Prüfung
für ein Passwort."
Nicht wahr? Wenn ich das erstellen der verschlüsselten Kennwort (wie beim anlegen eines Benutzers
record), wie kann ich das verschlüsselte Passwort als Salz? Es
existiert noch nicht. (Ich gehe davon aus, dass Sie verwenden, müssen Sie ebenfalls den gleichen salt für die Erstellung und überprüfung eines Passworts auf.)
Habe ich versucht, mit dem Klartext-Passwort als salt. Dies gilt
funktioniert, hat aber zwei Probleme; ein leicht zu überwinden, und ein ernster:
1) Die ersten beiden Buchstaben des Klartext-Passworts sind in der
crypted password. Sie können dieses Problem beheben, indem nicht das schreiben der ersten zwei
Zeichen in der Datei:
user_record = '%s:%s:%s' % (user_name, crypted_pw[2:], user_type)
2) mit dem Klartext-Passwort als salt, die Sie zu sein scheint
die Verringerung der Menge von Entropie in das system. Möglicherweise bin ich
Missverständnis der Zweck des Salzes.
Die beste Praxis, die ich habe in der Lage, abzuleiten, ist die Verwendung der ersten beiden
Zeichen aus dem Benutzernamen wie dem Salz. Dies wäre angemessen,
oder ist es etwas, was ich verpasst habe, dass macht, dass eine schlechte Bewegung?
Mein Verständnis für ein Salz ist, dass es verhindert, dass pre-computing-Passwort
hashes aus einem Wörterbuch. Ich könnte mit einem standard-Salz für alle
Kennwörter (wie meine Initialen "JS"), aber das scheint weniger ein
Aufwand für einen Angreifer als die Verwendung von zwei Zeichen aus jeder Benutzername.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für den Einsatz der crypt-Modul:
Beim GENERIEREN des verschlüsselten Passwort-geben Sie das Salz. Es könnte genauso gut Zufall sein Widerstand zu erhöhen, um brute-forcing, solange es erfüllt die genannten Bedingungen. Bei der ÜBERPRÜFUNG eines Passworts, sollten Sie den Wert von getpwname, in Fall, dass Sie auf ein system, unterstützt die größeren Salz-Größen und nicht es selbst generieren.
Allgemeine Bemerkungen:
Wenn das hat nichts zu tun w/ist-system-Anmeldungen, es gibt nichts Sie daran hindern, eine stärkere Methode als Krypta. Sie könnte nach dem Zufallsprinzip generieren N Zeichen von pro-Benutzer-Salz in Verbindung mit dem Passwort des Benutzers in eine SHA-1-hash.
UPDATE: dies ist Zwar weit sicherer gegen rainbow-Tabellen, die obige Methode hat immer noch kryptographischen Schwächen. Die korrekte Anwendung eines HMAC-Algorithmus kann noch weiter erhöhen Sie Ihre Sicherheit, sondern ist darüber hinaus mein Bereich der Sachkenntnis.
Python 's crypt() ist ein wrapper für das system' s crypt () - Funktion. Aus der Linux crypt () - Mann-Seite:
Betonung liegt auf "zwei Zeichen string". Nun, wenn man sich bei crypt()'s Verhalten in Python:
entdecken Sie, dass die ersten beiden Zeichen das Ergebnis ist immer Zusammenfallen mit den ersten beiden Buchstaben des ursprünglichen salt, der in der Tat die wahre zwei-Zeichen-salt selbst.
Das ist das Ergebnis von crypt() hat die form 2char-Salz + verschlüsselt-pass.
Es gibt also keinen Unterschied im Ergebnis, wenn statt der übergabe der zwei-Zeichen-Salz oder das original-viele-Zeichen-salt, übergeben Sie das ganze verschlüsselte Passwort.
Hinweis: die Menge [a–zA–Z0–9./] enthält 64 Zeichen, und 64*64=4096. Hier ist, wie zwei Zeichen beziehen sich auf "4096 verschiedenen Möglichkeiten".
Du bist Missverständnis in der Dokumentation; es sagt, dass da die Länge des salt-kann variieren je nach der zugrunde liegenden crypt () - Implementierung, sollten Sie die gesamte verschlüsselte Passwort als salt-Wert bei der überprüfung der Passwörter. Das heißt, anstatt ziehen die ersten zwei chars aus zu sein, das Salz, einfach werfen Sie in die ganze Sache.
Ihre Idee mit dem ersten Salz auf der Grundlage der Benutzername scheint okay zu sein.
Hier einige Allgemeine Hinweise auf das Salzen der Passwörter:
Ich würde nicht haben das Salz eine Funktion des Passworts. Ein Angreifer generiert eine rainbow-table haben eine instant-lookup-Datenbank der Kennwörter, aber Sie würde nur einmal. Wenn Sie eine zufällige 32-bit-Ganzzahl, müssten Sie generieren 2^32 Tabellen, die (im Gegensatz zu einem deterministischen Salz) kostet viel zu viel Speicher (und Zeit).
Für einige zusätzliche Stärke, die Sie bekommen können das crypt-Modul zu verwenden md5-durch die Verwendung eines salt in das format.
wo ABCDEFGH ist Ihre salt-string.
(Hinweis: dies ist eine gnu-Erweiterung zur Verschlüsselung finden Sie unter "man crypt" auf einem linux-system). MD5 (und jetzt auch SHA1) können "gebrochen", aber Sie sind immer noch relativ gut für Passwort-hashes und md5 ist immer noch der standard für linux-lokale Passwörter.
crypt.crypt("some_password","$5$some_salt")
odercrypt.crypt("some_password","$6$some_salt")
zu verwenden sha-256 oder sha-512, wenn Sie nicht Vertrauen MD5. Auch beachten Sie, dass crypt verwendet mehrere Runden DES/MD5/SHA* um es sicherer zu machen, dann nur mit einer einzigen Runde. Also MD5 gebrochen werden, bedeutet nicht automatisch, dass die Krypta mit $1$ ist.Das Passwort, oder alles, was abgeleitet von dem Kennwort " sollte niemals verwendet werden, da Salz. Das Salz für ein bestimmtes Passwort sollte unberechenbar sein.
Einen Benutzernamen oder einen Teil des Benutzernamens ist erträglich, aber noch besser wäre ein zufälliger bytes, die von einem kryptographischen Zufallszahlengenerator.
PBKDF2 verwenden, siehe dieser Kommentar in einem anderen thread (enthält die Python-Implementierung).
Werfen Sie einen Blick auf die Artikel TrueCrypt erklärt von Björn Edström. Es enthält leicht verständliche Erklärung, wie truecrypt arbeitet und ein einfaches Python-Implementierung von truecrypt die Funktionalität einschließlich Passwort-management.
Standard
crypt.crypt()
in Python 2 ist nicht sehr sicher und der Artikel erklärt, wie mehr sichere alternativen funktionieren könnte.