我正在使用Django 1.97。加密密码明显不同(就格式而言)。
某些密码的格式为$$$:
pbkdf2_sha256$24000$61Rm3LxOPsCA$5kV2bzD32bpXoF6OO5YuyOlr5UHKUPlpNKwcNVn4Bt0=
其他人的格式是:
!9rPYViI1oqrSMfkDCZSDeJxme4juD2niKcyvKdpB
使用User.objects.create_user()
或user.set_password()
设置密码。这种差异是预期的吗?
答案 0 :(得分:1)
回到V0.95,django使用$
分隔符来分隔算法/ salt / hash。这些天,django pulls out the algorithm first通过查看第一个$
前面的内容,然后将整个批次传递给hasher进行解码。这允许更广泛的格式,包括PBKDF2格式,在此列表中添加额外的迭代参数(根据您的第一个示例)。
但是,它也承认可能不允许某些用户登录和/或没有密码。这是使用您看到的第二种格式编码的。正如您所见here:
如果密码为None,则返回UNUSABLE_PASSWORD_PREFIX和随机字符串的串联,不允许登录。
您还可以看到随机字符串长度恰好为40个字符 - 就像您的第二个示例一样。
简而言之,这完全符合预期。
答案 1 :(得分:0)
onCreateView
和User.objects.create_user()
之间没有显着差异,因为首先使用秒。
根据docs,密码基本上是格式为user.set_password()
的字符串。差异可能来自<algorithm>$<iterations>$<salt>$<hash>
设置变量。可能是一个密码是使用一个哈希和其他密码创建的。但是,如果您将上述变量保留在上述变量中,则一切都应该没问题,用户也可以更改等等。您可以在bcrypt部分之后稍微注意一下。
PASSWORD_HASHERS
包的文档也可能有用。 Link
<强>更新强>:
如果您找到旧版django版本(1.3的文档),您会看到
之前的Django版本,例如0.90,使用了没有密码盐的简单MD5哈希。为了向后兼容,仍然支持这些;第一次check_password()对给定用户正常工作时,它们会自动转换为新样式。
所以我认为答案可能在某处。但这实际上取决于您的项目的遗产方式,因此您可以决定它是正常的还是什么。无论如何,你可以发出django.contrib.auth
来确定。或者您可以通过电子邮件向用户发送电子邮件,然后更改密码&#34;通知。真的涉及很多因素。