为什么Django中加密密码的格式有所不同

时间:2016-09-03 07:00:52

标签: python django

我正在使用Django 1.97。加密密码明显不同(就格式而言)。

某些密码的格式为$$$:

pbkdf2_sha256$24000$61Rm3LxOPsCA$5kV2bzD32bpXoF6OO5YuyOlr5UHKUPlpNKwcNVn4Bt0=

其他人的格式是:

!9rPYViI1oqrSMfkDCZSDeJxme4juD2niKcyvKdpB

使用User.objects.create_user()user.set_password()设置密码。这种差异是预期的吗?

2 个答案:

答案 0 :(得分:1)

你会没事的。您的数据库中只有一些空白密码。

回到V0.95,django使用$分隔符来分隔算法/ salt / hash。这些天,django pulls out the algorithm first通过查看第一个$前面的内容,然后将整个批次传递给hasher进行解码。这允许更广泛的格式,包括PBKDF2格式,在此列表中添加额外的迭代参数(根据您的第一个示例)。

但是,它也承认可能不允许某些用户登录和/或没有密码。这是使用您看到的第二种格式编码的。正如您所见here

  

如果密码为None,则返回UNUSABLE_PASSWORD_PREFIX和随机字符串的串联,不允许登录。

您还可以看到随机字符串长度恰好为40个字符 - 就像您的第二个示例一样。

简而言之,这完全符合预期。

答案 1 :(得分:0)

onCreateViewUser.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;通知。真的涉及很多因素。