2016-06-02 4 views
0

Я использую gevent greenlet, поэтому я очень ограничен всем, что связано с вычислением процессора. И мне нужно использовать сильный метод хэширования для хранения паролей.gevent и сильный метод пароля хеширования

Когда я не в GEvent контексте, я имею привычку использовать Bcrypt, но я сделал этот небольшой тест:

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 

что приводит:

time hash bcrypt 0.291887 
time check bcrypt 0.293343 

Это займет путь слишком много времени, которое будет использоваться как в зеленой одежде.

Как comparaison, тот же тип вычислений с использованием старого md5 хэш:

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

Какое решение у меня есть?

+0

bcrypt должен быть медленным, потому что хэши паролей должны быть медленными для расчета, чтобы предотвратить взлом – Daniel

+0

@ Даниэль: Я это понимаю. Мой вопрос больше о том, как я могу использовать этот вид хэширования в контексте gevent? – jobou

ответ

1

Gevent хорошо работает с сетью и связанными с IO функциями, которые используют преимущества параллелизма, но bcrypt не имеет этой функции.

Попробуйте использовать Processlet и ObjectPool. Процессор фокусируется на задачах, связанных с процессором, таких как хеширование, а не связанные с IO задачи. Отличный пример использования bcrypt с помощью Processlet и ObjectPool можно найти here.

+0

Да, но если я снижу коэффициент стоимости для bcrypt или любого другого типа функций деривации ключей (argon2, ...), то не будет никакого реального выигрыша в использовании этих хэш-методов. Как я сказал @ Даниэлю, мой вопрос действительно больше о том, что я могу сделать, чтобы не блокировать другие зелени, пока эта вещь вычисляет? – jobou

+0

К сожалению, Гевент не допускает параллелизма. Вместо этого попробуйте использовать Processlet. Хороший пример использования Processlets с bcrypt показан здесь (https://pypi.python.org/pypi/lets/0.0.9) –

+0

Интересно, что этот процесс и есть мешаничность пула. Я сделаю некоторое прототипирование с этим. Можете ли вы обновить свой первый ответ, чтобы я принял его? Благодарю. – jobou