2015-11-18 3 views
2

Im, не понимая, как я должен хранить хешированные пароли с помощью scrypt.Python - Правильный способ хранения паролей с помощью scrypt?

Вот пример:

import pyscrypt 

hashed = pyscrypt.hash(password = b"password", 
         salt = b"seasalt", 
         N = 1024, 
         r = 1, 
         p = 1, 
         dkLen = 16) 
print(hashed.hex()) #70ac953b777e24c4f41c4657eb9f03c2 

hashed = pyscrypt.hash(password = b"password", 
         salt = b"seasalt", 
         N = 1024, 
         r = 2, 
         p = 1, 
         dkLen = 16) 
print(hashed.hex()) #b00b951cd50675806c55d903dba9cbca 

hashed = pyscrypt.hash(password = b"password", 
         salt = b"seasalt", 
         N = 1024, 
         r = 1, 
         p = 2, 
         dkLen = 16) 
print(hashed.hex()) #7c3fa22552c8a9071da0e8c80a0a2767 

В приведенном выше примере мы можем видеть, что хэш изменяется в зависимости от параметра N, r, p значения.

Означает ли это, что я должен сохранить N, r, p значений тоже в базе?

Что я должен делать в будущем, когда на рынке будет доступно более мощное оборудование? Например, попросите пользователей изменить свой пароль, чтобы можно было применить новую функцию хэширования или что-то еще?

+0

Почему вы используете эту библиотеку в отличие от 'passlib', которая может легко хранить и понимать параметризованные и соленые хеши. –

+0

@ Antti Просто гадать, но passlib не поддерживает scrypt ...!? – deceze

ответ

1

Да, вам нужно будет сохранить параметры, которые вы использовали для генерации хэша, вместе с хэшем. Обычно проще всего объединить их в строку, например. N|r|p|len|salt|hash, или, возможно, JSON-encode dict. Вы также должны генерировать уникальную случайную соль для каждого пароля.

Будущие обновления могут быть обработаны в то время, когда пользователь входит в псевдокоде:.

if login_successful: 
    if not params_up_to_date(hashed_password): 
     hashed_password = hash(entered_password) 
     # update database record 

Вы проверяете, если параметры хэшированного пароль те же, что вы используете, и если вы не перефразировать пароль, который вы только что использовали во время процесса входа в систему. Пользователи могут постепенно, прозрачно обновляться таким образом.

+0

Хороший вопрос относительно будущих обновлений. Не возражаете ли вы рассказать мне, как бы вы объединили параметры с куском кода. Я застрял прямо там, и я прячу голову. Я имею в виду, что вы буквально хотите использовать что-то как: 'hash_value_to_submit_do_db = ('|' .join ([" N "," r "," p "," len "," salt "," hash "]))'. Это будет что-то вроде того, что использует bcrypt, не так ли? – RhymeGuy

+0

Да, что-то такое же тривиальное, как это будет. Пока вы можете отменить операцию и извлечь из нее исходные отдельные значения, это нормально. – deceze

0

Самое главное, что вы должны хранить salt на одного пользователя.

Обычно ваша запись будет поэтому быть что-то вроде:

username: scrypt,params,seasalt,89435389985698348998364 

(Вы хотите явно магазин тип записи в случае какой-либо другой механизм когда-либо использовали ранее для миграции, или позже в целом)