这个登录方案安全吗?

3
以下是关于Web应用程序登录方案的翻译:

我得到了一个Web应用程序登录方案。 数据库中将包含两个盐和hmac(hmac(密码, 盐1), 盐2)。

当用户进入登录页面时,他会得到盐1。 如果他已经启用了JavaScript,它会发送hmac(密码, 盐1),而不是明文密码。 如果没有启用JavaScript,则会发送明文密码。

因此,在服务器端接收到登录请求时,我们首先检查发送的内容(passwordSent)是否与hmac(passwordSent, salt2)匹配。如果不行,我们会尝试hmac(hmac(passwordSent, salt1), salt2)。

获取数据库访问权限的人不应该能够使用密码哈希值进行登录,并且我认为(但我可能错了)多个hmac并不会降低哈希防护性能。 有没有什么好的加密专家发现我可能犯的明显错误?

4个回答

6
这看起来有点像安全通过混淆,如果您仍然接受来自客户端的明文密码,那么使用JavaScript在客户端对密码进行哈希有什么意义?
您没有提到是否使用https,如果您不使用https,则可能根本没有密码。如果您不运行https,则任何中间人都可以看到您发送的盐以及用于哈希原始密码的JavaScript,因此您没有获得任何好处。
至于您对两个盐之间可能发生hmac碰撞的担忧,这可能是非常不可能的(取决于您的哈希算法)以及您保持盐值的安全程度。即使使用MD5也发现了一些碰撞攻击并且有一组彩虹表,但只要您非常非常安全地保护盐,就不会有问题。
请大家,请停止尝试实现自定义加密系统,除非您具有密码学背景。否则,您将搞砸它。--Aaronaught
说得好!

重点是如果客户端启用了JavaScript,不要让明文密码流传,但仍然允许不喜欢js的用户登录。如果他们有js,他们会得到更多的安全性,如果没有,那么情况并不比当前情况更糟。当JavaScript未激活时,应该有明确的指示(如SO)。它应该在https上运行,但如果用户使用恶意本地网络,则无法防止中间人攻击。攻击者将拥有使用的盐,但我只看到他可以执行两种攻击:暴力破解他得到的哈希值,或重放稍后发送的密码。 - Arkh
2
@Arkh:我想我们已经回答了你的问题。你认为这种方法确切地可以防止哪些攻击向量?从安全角度来看,你正在优雅地降级基本上是一个无操作。 - Aaronaught
我想要减少的向量是明文拦截。即使攻击者控制客户端和服务器之间的所有内容。 - Arkh
但是,您不能通过这种方案实现...除非客户端完全随机生成并且独立于服务器,否则在客户端和服务器之间的攻击者可以看到您用来生成哈希的代码,查看种子,然后可以使用选择纯文本攻击更高的概率破解密码。 其次,他们可以发起重放攻击,并在不知道用户密码的情况下访问系统。 - H. Green
谢谢,我完全忘记了攻击者会通过预先选择的盐来攻击散列密码。 HTTPS,我来了。 - Arkh

4
这听起来对我来说相当牵强。如果目的是通过HTTP发送明文密码以防止“中间人”攻击,那么请使用SSL。
在客户端哈希没有任何作用;除非盐实际上是一个nonce/OTP,并且未存储在数据库中,否则中间人可以简单地查看原始客户端发送的哈希并将其传递给服务器。服务器不会知道区别。
如果这旨在使破解更加困难,即使有人掌握了数据库,也无济于事。如果哈希函数很便宜,比如MD5,那么这将不会比一个盐和一个哈希更难破解(实际上它实际上更弱,因为哈希是一种有损函数)。如果您使用像bcrypt这样的强哈希函数,它已经足够好了。
请大家,请停止尝试实现自定义加密系统,除非您具有密码学背景。你会搞砸的。

请大家,除非你们有密码学背景,请停止尝试实现自定义加密系统。否则,你们会搞砸的。 是的,这就是为什么在实施任何东西之前我会询问明显的搞砸情况。 - Arkh
1
即使这个网站上所有专家都发表了自己的意见,也仍然不足以仅凭 stackoverflow.com 的“公共认可”来证明你的系统/方案已经“安全”。没有什么比加密方案的严格数学证明更为重要。请参考:“完美安全性”和“语义安全性”。 - H. Green

1

对你来说可能已经很明显了,但在这种设置中,实际上让人们使用两个不同的密码进行登录。

如果您想为人们提供使用加密方式发送密码的选项,我不会将其与任何严格的客户端相关联,而是强制使用HTTPS,就像Harley已经暗示的那样。


0
你可能想看一下HTTP摘要认证。这是一个标准化的协议,可以在任何情况下避免明文密码。

没有IE6:/。 但我会再多了解一下,因为这非常有趣。 - Arkh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接