Salt und hash ein Passwort in Python
Dieser code soll ein Kennwort hash mit einem salt. Das Salz und das gehashte Passwort in der Datenbank gespeichert. Das Passwort selbst nicht.
Angesichts der sensiblen Natur der operation, ich wollte sicher gehen, dass alles koscher war.
Hinweis: ich benutze das url-sichere version von b64encode aus Gewohnheit.
import hashlib
import base64
import uuid
password = 'test_password'
salt = base64.urlsafe_b64encode(uuid.uuid4().bytes)
t_sha = hashlib.sha512()
t_sha.update(password+salt)
hashed_password = base64.urlsafe_b64encode(t_sha.digest())
InformationsquelleAutor der Frage Chris Dutrow | 2012-03-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Diese Antwort ist falsch. Nicht verwenden einer kryptographischen hash zum speichern von Passwörtern. Verwenden Sie einen Passwort-hash.
Sieht für mich in Ordnung. Allerdings bin ich mir ziemlich sicher, dass Sie nicht wirklich benötigen base64. Sie könnten nur dazu:
Wenn es nicht zu Schwierigkeiten, kann man etwas effizienter Speicherung in der Datenbank durch speichern des salt und Hash-Passwort als rohe bytes, sondern hex-strings. So zu tun, ersetzen
hex
mitbytes
undhexdigest
mitdigest
.InformationsquelleAutor der Antwort Taymon
Die intelligente Sache ist, nicht zu schreiben, das crypto sich aber, etwas zu verwenden, wie passlib: https://bitbucket.org/ecollins/passlib/wiki/Home
Es ist einfach zu versauen, schreiben Sie Ihren crypto-code in einer sicheren Weise. Das Fiese daran ist, dass mit nicht-crypto-code, den Sie in der Regel sofort bemerken, wenn es nicht funktioniert, da Ihr Programm abstürzt. Während mit crypto-code, den Sie oft nur herausfinden, nachdem es zu spät ist und Ihre Daten gefährdet sind. Deshalb denke ich, es ist besser, um ein Paket von einer anderen Person geschrieben, wer ist kenntnisreich über das Thema und die basiert auf der Schlacht getestet Protokolle.
Auch passlib hat einige nette features, die es einfach zu bedienen und auch einfach ein upgrade auf eine neuere Passwort-hashing-Protokoll, wenn ein altes Protokoll stellt sich heraus, um gebrochen zu werden.
Auch nur eine einzige Runde von sha512 ist mehr anfällig für Wörterbuch-Attacken. sha512 ist entworfen, um schnell und das ist eigentlich eine schlechte Sache, wenn Sie versuchen zu speichern Passwörter sicher. Andere Leute gedacht haben lange und hart über diese Art Themen, so dass Sie besser zu nutzen.
InformationsquelleAutor der Antwort koffie
Basierend auf die anderen Antworten auf diese Frage, habe ich realisiert einen neuen Ansatz mit bcrypt.
Warum bcrypt
Wenn ich das richtig verstehe, ist das argument verwenden
bcrypt
überSHA512
ist, dassbcrypt
ist entworfen, langsam zu sein.bcrypt
hat auch eine option, um einzustellen, wie langsam Sie wollen, dass es beim generieren des Hash-Passwort für die erste Zeit:Langsam ist wünschenswert, weil, wenn ein böswilliger Partei bekommt Ihre Hände auf die Tabelle mit Hash-Passwörter, dann ist es viel schwieriger, Sie zu de-verschlüsseln.
Implementierung
Notes
War ich in der Lage, um die Bibliothek zu installieren, ziemlich leicht in ein linux-system verwenden:
Allerdings hatte ich mehr Probleme beim installieren auf meinem windows-Systeme. Es wird angezeigt, dass ein patch. Siehe diese Stackoverflow-Frage: py-bcrypt Installation auf win 7 64bit python
InformationsquelleAutor der Antwort Chris Dutrow
Damit dies funktioniert in Python 3 müssen Sie die UTF-8 Kodieren, zum Beispiel:
Andernfalls bekommen Sie:
InformationsquelleAutor der Antwort Wayne
passlib scheint nützlich zu sein wenn Sie brauchen, um die Verwendung von hashes gespeichert, die von einem vorhandenen system. Wenn Sie die Kontrolle über das format, verwenden Sie ein modernes hash wie bcrypt oder scrypt. Zu dieser Zeit, bcrypt scheint zu sein, viel einfacher, die Verwendung von python.
passlib bcrypt unterstützt, und empfiehlt die Installation von py-bcrypt als backend: http://pythonhosted.org/passlib/lib/passlib.hash.bcrypt.html
Könnten Sie auch py-bcrypt direkt, wenn Sie nicht wollen, zu installieren passlib. Die readme-Datei enthält Beispiele grundlegende Verwendung.
siehe auch: Wie zu verwenden scrypt zu generieren hash für Passwort und Salz in Python
InformationsquelleAutor der Antwort Terrel Shumway
Ich don' wollen wiederbeleben eines alten Threads, aber... wer eine moderne, up-to-date sichere Lösung, verwenden Sie argon2.
https://pypi.python.org/pypi/argon2_cffi
Gewann er die Passwort hashing competition. ( https://password-hashing.net/ ) Es ist einfacher zu verwenden als bcrypt, und es ist sicherer als bcrypt.
InformationsquelleAutor der Antwort nagylzs