хэш паролей django каждый раз разный - PullRequest
0 голосов
/ 25 апреля 2018

если я создаю хеш с помощью django.contrib.auth.hashers.make_password django для одной и той же строки, я получаю каждый раз разные хэши. Я не понимаю, как это законно, потому что, насколько я знаю, хеш-функции должны генерировать один и тот же хэш каждый раз, так как по определению это функция. Чего мне не хватает?

from django.contrib.auth.hashers import make_password
password = "helloworld"
h1 = make_password(password)
h2 = make_password(password)
print h1, h2

h1 = u'pbkdf2_sha256 $ 20000 $ Tr6NV5MewXYl $ X + sezT6WRqBwYmJR / RZmZHLP6 / l6ntSaBke0RKU1 / v0 = '

h2 = u'pbkdf2_sha256 $ 20000 $ 05rEmxChtXlI $ NdZGfTKH + kqt1viuFng3GmvBp6eJcsstxV4JcDlBGIs = '

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

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Каждый раз, когда вы используете make_password, пароль хешируется с другой солью. Джанго хранит соль с помощью хешированного пароля. Затем вы можете использовать check_password, чтобы проверить пароль позже.

from django.contrib.auth.hashers import check_password, make_password
password = "helloworld"
h1 = make_password(password)
check_password(password, h1)  # returns True
check_password("incorrect", h1)  # returns False

Прочтите документы на , как Django хранит пароли для получения дополнительной информации.

0 голосов
/ 25 апреля 2018

Вы видите разные результаты из-за соли . Проще говоря, Django добавляет произвольную строку к паролю перед хэшированием, чтобы получить разные значения даже для одного и того же пароля. Это делает атаку rainbaw tables бесполезной. На самом деле то, что вы видите в БД, не является простым хеш-значением, оно имеет структуру в следующем формате: <algorithm>$<iterations>$<salt>$<hash>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...