2 Stimmen

Beste Praxis für Zwei-Wege-Hashing in Python?

Ich möchte den Benutzern die Möglichkeit geben, ihre E-Mail-Adresse durch Klicken auf einen Link zu bestätigen. Der Link würde etwa so aussehen

http://www.example.com/verifyemail?id=some-random-string

Wenn ich diese E-Mail sende, möchte ich in der Lage sein, diese "some-random-string" von Zeile id des Benutzers, eine ganze Zahl leicht zu generieren. und wenn Benutzer auf diesen Link klickt, generieren, dass ganze Zahl zurück.

Die einzige Bedingung ist, dass diese "Irgendeine-Zufallszeichenkette" so undurchsichtig und für den Benutzer nicht erratbar wie möglich sein sollte.


Schließlich habe ich mich für Folgendes entschieden

def p3_encrypt_safe(plain, key):
    return base64.urlsafe_b64encode(p3_encrypt(plain, key))

die nette Krypto-Bibliothek von http://www.nightsong.com/phr/crypto/p3.py Die Hinzufügung der sicheren base64-Kodierung stammt von mir.

5voto

David Z Punkte 121773

Verwenden Sie die Verschlüsselung, denn genau dafür ist sie gedacht. Blowfish, AES, sogar DES3, wenn Sie keine besonders hohe Sicherheit benötigen.

Alternativ könnten Sie einen SHA-256 oder SHA-512 (oder was auch immer) Hash der E-Mail-Adresse berechnen und ihn zusammen mit der E-Mail-Adresse selbst in einer Datenbank speichern. Auf diese Weise können Sie die E-Mail-Adresse einfach nachschlagen, indem Sie den Hash als Schlüssel verwenden.

5voto

DzinX Punkte 51124

Am besten ist es, einen Hash (eine Einwegfunktion) von einigen Daten des Benutzers zu erzeugen. Um z. B. einen Hash für die Zeilennummer des Benutzers zu erzeugen, könnten Sie etwas wie folgt verwenden:

>>> import hashlib
>>> hashlib.sha1('3').hexdigest()
'77de68daecd823babbb58edb1c8e14d7106e83bb'

Die Pseudo-Zufallszeichenfolge nur auf eine Zeilen-ID zu stützen, ist jedoch nicht sehr sicher, da der Benutzer den Hash leicht umkehren könnte (versuchen Sie googling 77de68daecd823babbb58edb1c8e14d7106e83bb ) einer so kurzen Zeichenkette.

Eine einfache Lösung besteht darin, die gehashte Zeichenfolge zu "salzen", d. h. jedem gehashten Wert die gleiche geheime Zeichenfolge hinzuzufügen. Zum Beispiel:

>>> hashlib.sha1('3' + 'email@of.user' + 'somestringconstant').hexdigest()
'b3ca694a9987f39783a324f00cfe8279601decd3'

Wenn Sie google b3ca694a9987f39783a324f00cfe8279601decd3 Das einzige Ergebnis wird wahrscheinlich ein Link zu dieser Antwort sein :-), was kein Beweis ist, aber ein guter Hinweis darauf, dass dieser Hash ziemlich einzigartig ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X