django密码哈希每次都不同

时间:2018-04-25 09:28:02

标签: django hash passwords

如果我使用相同字符串的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

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

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

我怀疑每次使用不同的算法进行散列,因此散列也不同。我是对的吗?

2 个答案:

答案 0 :(得分:5)

由于salt,您会看到不同的结果。简单来说,Django在散列之前向密码添加一些随机字符串,即使对于相同的密码也能获得不同的值。这使得rainbaw tables攻击毫无用处。实际上你在DB中看到的不是普通哈希值,它的结构如下:<algorithm>$<iterations>$<salt>$<hash>

答案 1 :(得分:3)

每次使用make_password时,密码都会使用不同的哈希值进行哈希处理。 Django使用哈希密码存储salt。然后,您可以稍后使用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

阅读how Django stores passwords上的文档了解详情。