2016-06-02 6 views
0

ich benutze gevent greenlet so bin ich sehr eingeschränkt durch alles im zusammenhang mit CPU-berechnung. Und ich muss eine starke Hashing-Methode für den Passwortspeicher verwenden.gevent und stark hashing passwort methode

Wenn ich nicht in einem GEVENT Zusammenhang habe ich die Gewohnheit bcrypt verwenden, aber ich habe diesen kleinen Test:

import bcrypt 
import time 

password = b"toto" 

start_hash = time.clock() 

hashed = bcrypt.hashpw(password, bcrypt.gensalt()) 

print 'time hash bcrypt %s' % (time.clock() - start_hash) 

start_compare = time.clock() 

assert bcrypt.hashpw(password, hashed) == hashed 

elapsed = (time.clock() - start_compare) 

print 'time check bcrypt %s' % elapsed 

was zur Folge hat:

time hash bcrypt 0.291887 
time check bcrypt 0.293343 

nehmen diese viel zu viel Zeit zu verwenden, wie es in einem Greenlet ist.

Als comparaison, die gleiche Art von Berechnung des alten MD5-Hash mit:

time hash md5 4.1e-05 
time check hash md5 1.1e-05 

Welche Lösung habe ich?

+0

bcrypt muss langsam sein, weil Passwort-Hashes langsam sein müssen, um Hacking zu vermeiden – Daniel

+0

@Daniel: Ich verstehe das. Meine Frage ist mehr darüber, wie kann ich diese Art von Hashing in einem Gevent-Kontext verwenden? – jobou

Antwort

1

Gevent funktioniert gut mit Netzwerk- und E/A-gebundenen Funktionen, die die Nebenläufigkeit nutzen, aber bcrypt verfügt nicht über diese Funktionalität.

Versuchen Sie es mit Processlet und ObjectPool. Processlet konzentriert sich auf CPU-gebundene Tasks, wie Hashing, nicht IO-gebundene Tasks. Ein gutes Beispiel für die Verwendung von bcrypt mit Processlet und ObjectPool finden Sie here.

+0

Ja, aber wenn ich den Kostenfaktor für bcrypt oder irgendeine andere Art von Schlüsselableitungsfunktionen (Argon2, ...) herabsetze, wird es keinen wirklichen Gewinn bei der Verwendung dieser Hash-Methoden geben. Wie ich zu @Daniel gesagt habe, meine Frage ist wirklich mehr darüber, was ich tun kann, um andere Greenlets nicht zu blockieren, während dieses Ding berechnet? – jobou

+0

Leider erlaubt Gevent keine Parallelität. Versuchen Sie stattdessen, ein Processlet zu verwenden. Ein gutes Beispiel für die Verwendung von Processlets mit bcrypt ist [hier] (https://pypi.python.org/pypi/lets/0.0.9) –

+0

Interessant ist dieses processlet und es gibt auch einen Pool-Mechanismus. Ich werde etwas Prototyping damit machen. Können Sie Ihre erste Antwort aktualisieren, damit ich sie akzeptiere? Vielen Dank. – jobou

Verwandte Themen