使Django.contrib.auth存储纯文本密码

drd*_*man 1 authentication passwords django

我有一个基于Django的站点(尚未启动,因此没有真正的用户)使用plain django.contrib.auth,并希望将密码存储为纯文本,而不是盐渍SHA-1哈希.

问题是,如果没有修补(或猴子修补)Django源代码,最好的方法什么?

注意:我完全知道这肯定不太安全.明文需要执行质询-响应AUTH,像CHAP对PPTP VPN,DIGEST-MD5为IMAP4和HTTP摘要基于WebDAV的文件存储.所以,我正在使用连接级安全性来交换数据库级安全性.

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

可逆地加密(混淆)密码,并使用一些排序列级权限,因此密码将是INSERTable/UPDATEable,但不是Web用户可选择的(只能访问一些自定义检查功能,SELECT * FROM users WHERE 'somesha1hash' = USER_HMAC(id, 'salt')所以)密码不会"只是在那里"这是一个主意,我会尽力去做.关于保护明文数据的建议受到热烈欢迎,但我最想听到的是如何破解密码的存储方式.

rob*_*rob 6

在Django中,它并不难:您只需要编写一个身份验证后端,它将根据存储在纯文本中的密码对用户进行身份验证.

也就是说,你永远不应该以明文存储密码.
重点是人们倾向于一遍又一遍地使用相同的密码,因此,在您的网站中使用明文会让您的用户面临攻击者访问其银行帐户的风险.
杰夫阿特伍德写了一篇很好的帖子,关于这个话题,你可能会错误地存储密码 ; 我建议你阅读它,因为它会以比我更好的方式解释密码中明文的问题.
至少,您应该鼓励您的用户使用与其"安全"密码不同的密码; 例如,您可以简单地生成新的随机密码,即使这种方法也有其自身的局限性.

另一种方法可能更安全:编写您的身份验证后端,它将验证(例如)WebDAV存储.您不会将密码存储在系统中的任何位置 - 您只需将密码传递给它们即可.我不知道它是否适用于您的情况(特别是如果您必须对多个来源进行身份验证),但至少您可以尝试一下.


lin*_*eak 5

有很多非常好的方案可以将密码保存为纯文本(儿童游戏网站等)。这实际上很容易做到。

在您的设置中添加:

PASSWORD_HASHERS = ('wereallfriendsinunikittyland.PlainTextPassword',)    
Run Code Online (Sandbox Code Playgroud)

比创建一个文件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),
        ])
Run Code Online (Sandbox Code Playgroud)