制作Django.contrib.auth店明文密码(Making Django.contrib.a

2019-09-18 02:47发布

我有一个基于Django的网站(尚未推出,所以没有真正的用户)使用纯django.contrib.auth ,并希望密码保存为纯文本,不咸SHA-1散列。

现在的问题是什么是做到这一点的最好办法,希望没有打补丁(或猴子修补)Django的源代码?

:我完全知道这肯定是不太安全。 明文需要执行质询 - 响应AUTH,像CHAP对PPTP VPN,DIGEST-MD5为IMAP4和HTTP摘要基于WebDAV的文件存储。 于是,我与连接级别的安全交易DB级别的安全性。

当然,我在考虑教育,并鼓励使用X.509证书(并没有任何密码)的用户,但是这并不是那么容易。

可逆加密(混淆)的密码,并使用某种列级的权限,这样的密码将被插入/更新,而不是由网络用户(仅适用于一些自定义的检查功能来访问,如选择SELECT * FROM users WHERE 'somesha1hash' = USER_HMAC(id, 'salt')所以密码不会是“就在那里”是个主意,我会尽力去做。 有关保护明文数据的建议的热烈欢迎,但我最想听到的是如何破解密码的存储方式。

Answer 1:

有保持密码的纯文本(儿童游戏网站等)一群非常好的方案。 这其实很容易做到的。

在你的设置中添加:

PASSWORD_HASHERS = ('wereallfriendsinunikittyland.PlainTextPassword',)    

不是创建一个文件wereallfriendsinunikittyland.py

from django.contrib.auth.hashers import BasePasswordHasher

class PlainTextPassword(BasePasswordHasher):
    algorithm = "plain"

    def salt(self):
        return ''

    def encode(self, password, salt):
        assert salt == ''
        return password

    def verify(self, password, encoded):
        return password == encoded

    def safe_summary(self, encoded):
        return OrderedDict([
            (_('algorithm'), self.algorithm),
            (_('hash'), encoded),
        ])


Answer 2:

在Django中,它并不难:您只需编写一个认证后端 ,将验证与存储明文密码的用户。

这就是说, 你不应该存储密码明文
主要的一点是,人们往往会再次因此反复使用相同的密码,使用你的网站,你把你的用户在风险攻击者明文去他们的银行账户。
杰夫阿特伍德写了一篇很好的贴子,关于这个话题, 你可能储存密码不正确 ; 我建议你读它,因为它会解释有关在一个比我更好的方式在密码明文的问题。
至少,你应该鼓励用户使用他们的“安全”的人不同的密码; 例如,你可以简单地生成新的随机密码,即使这种方法有其自身的局限性,太。

另一种方法,这可能是更安全:写你的认证后端,将验证对(例如)WebDAV的存储。 你不会在任何地方保存密码在你的系统 - 您只需通过他们通过。 我不知道是否可以在你的情况下工作(特别是如果你要对几个来源进行身份验证),但至少你可以试试看。



Answer 3:

不要这样做。 它违背了基本的安全原则。 最好不要有密码不是做这个的。

关于你提到的更新问题:存储在一个单独的表加密的外部访问密码(他们可能不都相同,反正)。 用户用户的密码为这个加密生成的盐渍关键。 然后,她德恩登录,您的应用程序可以解密和使用这些密钥。

这很艰难,以得到正确的。 祝好运!



Answer 4:

为什么?

试图让像Django的质量框架做错事,有目的的,可能需要一定量的拔头发。



文章来源: Making Django.contrib.auth store plain-text password