代码之家  ›  专栏  ›  技术社区  ›  drdaeman

生成django.contrib.auth存储纯文本密码

  •  1
  • drdaeman  · 技术社区  · 17 年前

    我有一个基于django的网站(还没有发布,所以没有真正的用户)使用plain django.contrib.auth ,并希望将密码存储为纯文本,而不是salted sha-1哈希。

    问题是 最好的方法是什么,希望不用修补(或猴子修补)django源代码?

    注释 我完全知道这是 当然 不太安全。执行质询响应身份验证需要纯文本,如用于PPTP VPN的CHAP、用于IMAP4的Digest-MD5和用于基于WebDAV的文件存储的HTTP Digest。所以,我用连接级别的安全性来交换数据库级别的安全性。

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

    可逆地加密(模糊)密码,并使用某些排序列级权限,以便密码可以插入/更新,但不能由Web用户选择(仅可访问某些自定义检查功能,如 SELECT * FROM users WHERE 'somesha1hash' = USER_HMAC(id, 'salt') )所以密码不是“只存在”而是 好的 我会尽力去做的。关于保护明文数据的建议很受欢迎,但我最想听到的是如何破解密码的存储方式。

    4 回复  |  直到 10 年前
        1
  •  4
  •   fmalina    10 年前

    有很多非常好的场景可以让密码保持纯文本(儿童游戏网站等)。其实很容易做到。

    在设置中添加:

    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),
            ])
    
        2
  •  6
  •   rob    17 年前

    在Django,这并不难:你只需要写一个 authentication backend ,将根据明文存储的密码对用户进行身份验证。

    这就是说, 您不应该以纯文本形式存储密码 .
    主要的一点是,人们往往一次又一次地使用相同的密码,因此,在您的站点中使用明文,会使您的用户面临攻击者进入其银行帐户的风险。
    杰夫·阿特伍德写了一篇关于这个话题的好文章, You're Probably Storing Passwords Incorrectly 我建议你读一下,因为它会比我更好地解释密码中的明文问题。
    至少,您应该鼓励您的用户使用与“安全”密码不同的密码;例如,您可以简单地生成新的随机密码,即使这种方法也有其自身的限制。

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

        3
  •  3
  •   Ber    17 年前

    不要这样做。 它违反了基本安全原则。最好不要密码,而不要这样做。

    关于更新后的问题: 将加密的外部访问密码存储在单独的表中(它们可能不完全相同)。为该加密生成的salt密钥的用户用户密码。然后,温她登录,你的应用程序可以解密和使用这些密钥。

    这确实很难纠正。祝你好运!

        4
  •  -1
  •   yfeldblum    17 年前

    为什么?

    试图建立一个像Django这样的质量框架 错误的 这件事,故意的,可能需要一定量的头发拉扯。