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 ='
我怀疑每次都使用不同的算法来哈希,因此哈希也不同。我对么?
由于盐分,您会看到不同的结果。简而言之,Django会在哈希之前为密码添加一些随机字符串,以获取即使对于相同密码也可以得到不同的值。这使得rainbaw tables攻击毫无用处。实际上,您在DB中看到的不是简单的哈希值,而是以下格式的结构:<algorithm>$<iterations>$<salt>$<hash>
每次使用时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如何存储密码的文档以获取更多信息。
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |