好吧,这听起来像是一个奇怪的问题。跳上我之前请仔细阅读好吗?;-)
想象一下这种情况:
- 我们有一个服务器和一个客户端。
- 他们使用 SSL 连接。
- 客户端使用密码在服务器上创建帐户。
- 但是,他实际上通过网络传递给服务器的是密码的哈希(+salt)(不是密码)
- 服务器将此接收到的密码哈希保存在数据库中(再次用盐哈希)
- 在登录时,为了进行身份验证,用户重新发送密码哈希(不是密码!)。
好的,所以是的,我意识到这听起来很奇怪。是的,整个对话都在 SSL 中,所以你可以只发送密码明文。是的,我意识到可以以散列形式安全地存储明文密码。
这是我要强调的一点:真诚地说“我们永远不会知道您的密码”对我们的业务很有用。
请注意,我并不是说“我们不会以明文形式存储您的密码”,而是说我们真的、永远不会知道它;你从来没有把它给我们。
(想要这个的原因是不相关的,足以说用户的密码用于其他东西,例如文件加密)。
是的,我意识到您可能会说,以正常的方式执行此操作“在您进行散列时,密码只会在内存中以明文形式保存 5 毫秒”,但这更多是关于可否认性。即,我们可以说 100% 我们甚至没有收到您的密码。
好的,这是问题:
有没有人做过或听说过这种事情?
这样做有什么安全隐患?
我很难看到不利的一面。例如:
- 没有重播攻击(因为会话是使用 SSL 加密的,所以攻击者看不到哈希值)
- 无法查看数据库,因为散列本身就是,呃...,散列
好的,你现在可以跳到我身上了 :)
欢迎提出想法,评论。
谢谢,
约翰
更新:只是想澄清一下:我并不是说这在某种程度上是对身份验证过程安全性的改进。但是,相反,它允许用户的“真实”密码保密,甚至对服务器也是如此。因此,如果真实密码用于加密文件,则服务器无权访问该密码。
我对我想要这个的理由完全满意,问题是它是否会阻碍身份验证过程的安全性。