【发布时间】:2011-01-10 01:31:14
【问题描述】:
好的,这听起来像是一个奇怪的问题。跳上我之前请仔细阅读好吗? ;-)
想象一下这种情况:
- 我们有一个服务器和一个客户端。
- 他们使用 SSL 连接。
- 客户端使用密码在服务器上创建帐户。
- 但是,他实际上通过网络传递给服务器的是密码的哈希 (+salt)(不是密码)
- 服务器将收到的密码哈希值保存在 DB 中(再次使用 salt 哈希值)
- 在登录时,为了进行身份验证,用户重新发送密码哈希(不是密码!)。
好的,是的,我意识到这听起来很奇怪。是的,整个对话都在 SSL 中,所以你可以只发送密码明文。是的,我意识到可以以散列形式安全地存储明文密码。
这就是我要强调的一点:真诚地说“我们永远不会知道您的密码”对我们的业务很有用。
请注意,我并不是说“我们不会以明文形式存储您的密码”,而是说我们真的、永远不会知道它;你永远不会把它给我们。
(想要这个的原因无关紧要,足以说明用户的密码用于其他用途,例如文件加密)。
是的,我知道您可能会说,以正常的方式执行此操作“在您进行散列时,密码只会在内存中以明文形式保存 5 毫秒”,但这更多是关于可否认性。即,我们可以说 100% 我们甚至没有收到您的密码。
好的,问题来了:
以前有人做过或听说过这种事情吗?
这样做有什么安全隐患?
我很难看到缺点。例如:
- 无重放攻击(由于会话是使用 SSL 加密的,因此攻击者看不到哈希值)
- 无法在数据库中查找,因为哈希本身就是哈希,呃...,哈希
好吧,你现在可以跳到我身上了 :)
想法,欢迎cmets。
谢谢,
约翰
更新:只是想澄清一下:我并不是说这是对身份验证过程的安全性的某种改进。但是,相反,它允许用户的“真实”密码保密,甚至对服务器也是如此。因此,如果真实密码用于加密文件,则服务器无权访问该密码。
我对我想要这个的理由完全满意,问题是它是否是身份验证过程安全性的障碍。
【问题讨论】:
-
他使用 hash/salt 注册(然后登录)——这确实是他的密码。所以找回密码的机制是一样的,只是在客户端而不是服务器。变化不大。
-
添加一些内容作为对这个问题的参考:en.wikipedia.org/wiki/Host-proof_hosting
标签: authentication ssl hash cryptography http-digest