django密码哈希每次都不同

cod*_*oda 2 passwords django hash

如果我使用相同字符串的django.django.contrib.auth.hashers.make_password创建哈希,则每次都会得到不同的哈希。我不明白这是怎么合法的,因为据我所知,哈希函数每次都必须生成相同的哈希,因为根据定义,哈希函数是一个函数。我想念什么?

from django.contrib.auth.hashers import make_password
password = "helloworld"
h1 = make_password(password)
h2 = make_password(password)
print h1, h2
Run Code Online (Sandbox Code Playgroud)

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

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

我怀疑每次都使用不同的算法来哈希,因此哈希也不同。我对么?

nev*_*ner 6

由于盐分,您会看到不同的结果。简而言之,Django会在哈希之前为密码添加一些随机字符串,以获取即使对于相同密码也可以得到不同的值。这使得rainbaw tables攻击毫无用处。实际上,您在DB中看到的不是简单的哈希值,而是以下格式的结构:<algorithm>$<iterations>$<salt>$<hash>


Ala*_*air 5

每次使用时make_password,密码都会用不同的盐进行哈希处理。Django使用哈希密码存储盐。然后,您可以稍后使用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
Run Code Online (Sandbox Code Playgroud)

阅读有关Django如何存储密码的文档以获取更多信息。