我有一个基于Django的网站(尚未启动,因此没有真正的用户)使用普通django.contrib.auth
,并希望将密码存储为纯文本,而不是盐渍的SHA-1哈希值。
问题是这样做的最佳方法是什么,希望如果没有修补(或猴子修补)Django源代码?
注意:我完全知道肯定不太安全。明文需要执行质询 - 响应身份验证,例如PPTP VPN的CHAP,IMAP4的DIGEST-MD5和基于WebDAV的文件存储的HTTP摘要。因此,我正在使用连接级安全性来交换数据库级安全性。
当然,我正在考虑教育和鼓励用户使用X.509证书(并且没有任何密码),但这并不容易。
可逆地加密(混淆)密码,并使用某些排序列级权限,因此密码将是INSERTable / UPDATEable,但不是Web用户可选择的(只能访问某些自定义检查功能,如SELECT * FROM users WHERE 'somesha1hash' = USER_HMAC(id, 'salt')
)所以密码不会“只是在那里”是一个好的想法,我会尝试这样做。关于保护明文数据的建议受到热烈欢迎,但我最想听到的是如何破解密码的存储方式。
答案 0 :(得分:6)
在Django中,并不是那么难:你只需要写一个authentication backend,它将根据存储在纯文本中的密码对用户进行身份验证。
那就是说,你永远不应该以明文存储密码
重点是人们倾向于一遍又一遍地使用相同的密码,因此,在您的网站中使用纯文本会让您的用户面临攻击者访问其银行帐户的风险。
杰夫阿特伍德写了一篇关于这个主题的好文章,You're Probably Storing Passwords Incorrectly;我建议你阅读它,因为它会以比我更好的方式解释密码中有关明文的问题
至少,您应该鼓励您的用户使用与其“安全”密码不同的密码;例如,您可以简单地生成新的随机密码,即使这种方法也有其自身的局限性。
另一种可能更安全的方法:编写您的身份验证后端,以验证(例如)WebDAV存储。您不会将密码存储在系统中的任何位置 - 您只需将密码传递给它们即可。我不知道它是否适用于您的情况(特别是如果您必须对多个来源进行身份验证),但至少您可以尝试一下。
答案 1 :(得分:4)
保存密码纯文本(儿童游戏网站等)有很多非常好的方案。它实际上很容易做到。
在您的设置中添加:
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 :(得分:3)
不要这样做。 它违反了基本的安全原则。最好不要密码而不是这样做。
关于您更新的问题: 将那些外部访问密码存储在一个单独的表中(它们可能不一样都是相同的)。用户用户密码,用于为此加密生成加密密钥。然后,当她登录时,你的app可能会解密并使用这些密钥。
这确实很难做到。祝你好运!
答案 3 :(得分:-1)
为什么?
尝试制作像Django这样的质量框架,故意做错误的事情,可能需要一定量的拔毛。