在客户端散列密码是否有安全意义

IaC*_*der 26 security client-side

如果您要在将用户密码发送到线路之前对其进行哈希处理并将其保留为内存中的纯文本,这是否会提高应用程序的安全性?

我认为这可以通过保护存储在客户端内存中的数据来减轻一小部分漏洞.但实际上,如果我们担心有人在阅读客户的记忆,那么可能存在我们无法解决的更大问题.

在客户端有一些对哈希感觉不正确的事情.

客户端密码散列是否常见?这样做还有其他优点或缺点吗?

编辑:鉴于通信渠道是安全的(SSL).在什么条件下使用这种方法是可以接受和值得的.我问这个是因为"安全专家"建议我在某些应用程序功能中使用这样的方案.

geo*_*car 19

没有.

当客户端发送的东西,无论是PH(P)H(H(P))任何人谁截取这可以简单地重新发送同样的事情,从而使这样的等同于直接使用密码的功能.

这就是你应该使用随机数的原因; 服务器可以发出一些随机垃圾k,客户端将计算H(P,k)并将其发送到服务器.HMAC是这种方法的流行实现.

如果服务器从不接受两次相同的nonce,这对于重放攻击是安全的.

  • ...但这会创建一个DoS机会:捕获发送到客户端的每个服务器nonce,并在合法客户端之前使用它; 瞧,现在客户端根本无法登录,因为在客户端发送请求时,每个现时已经过期.不是一个完全实际的场景,但一如既往,安全性需要与可用性保持平衡,有时候添加一个会减少另一个. (12认同)
  • 正如其他答案所指出的那样,在客户端上进行散列有一些*轻微的优势,因为许多用户使用多个服务重用密码. (5认同)
  • @geocar:我同意你的要点,如果你依靠这个来实现端到端的安全性,你就是做错了; 我同意你的建议,使用nonce/HMAC来加强它.我只是不同意你的绝对声明,即客户端散列绝对没有任何好处 - 在其他答案中,Lucas Oman,David Thornley和user1700819都指出了客户端散列的潜在*轻微*好处. (3认同)

moo*_*dow 14

哈希与您描述的场景中的安全POV的密码相同:如果我拦截哈希,我不需要知道密码,我可以向服务器发送我截取的哈希值.

认证协议有一定的篇幅可以避免这个问题; 安全性很难,你最好选择和实现一个易于理解的协议,而不是自己动手.

如果您的流量通过SSL,您可以安全地拦截并且散列为您提供额外的好处.

  • 它不相同的唯一方法是用户的密码 - 他可能用于多个帐户 - 不是在野外. (12认同)
  • @Tito“单个基本哈希对保护密码没有任何作用”这是一个公然的谎言。Hashcat 正在进行暴力攻击,这意味着如果密码是任何长度,攻击者都无法猜测它。因此,如果在多个服务中使用相同的长密码,则只有哈希值的攻击者只能在接受该哈希值的服务上使用它。如果执行此操作的每个站点都使用相同的哈希算法,但使用不同的、特定于供应商的随机数,那么您几乎可以保证哈希值仅在一个站点上有用。 (2认同)

Dav*_*ley 14

发送散列密码不会提高您网站的安全性,正如其他人所指出的那样(因为您接受哈希密码,所有坏人需要知道的是哈希版本).它也不是很安全,因为坏人可能会加载你的登录页面并检查部署的Javascript或Java.

它所做的是阻止有人看到数据包能够提取密码,这是适度有用的.许多人在多个站点上使用相同的密码(除了安全性较高的站点之外,我都使用相同的密码),因此如果您可以从中获取一个密码,则可以登录其他站点上的其他帐户.

它还可以防止真实密码在您的网站上存储,甚至暂时存储,如果您的网站遭到入侵,这可能会提供额外的安全性.

因此,虽然我认为用户端散列可能是一件好事,但是不值得花费更多的麻烦.

而且,正如其他人告诉你的那样,不要自己动手.有太多可能出错的事情.你几乎不会像练习的坏人那样快速地注意到它们.


小智 12

是的你应该.

IEEE有一个数据泄露,其中100K电子邮件和密码从博客中暴露出来.

http://ieeelog.com/

显然,IEEE不应该暴露他们的博客!但如果他们在客户端窃取了密码,那就不会那么糟糕了.

作为第一个答案,您应该使用随机数.如果你使用足够长的nonce(例如128位),你实际上不需要担心重用,因为服务器永远不会要求两次相同的nonce(假设正确播种的CRNG等).


Vin*_*lds 5

不,客户端的散列不能完全保护密码.当一个人选择在客户端散列密码时,提交给服务器的摘要基本上就成了密码.如果部署SSL,这本身不是问题.

但是,这种方案最终会产生比解决的问题更多的问题.如果服务器将客户端提交的哈希值与数据库中存储的哈希值进行比较而不执行任何进一步的加密操作(尤其是对输入数据进行哈希处理),则密码以明文形式存储以用于所有实际目的.任何有权访问存储哈希的人都可以将其重新提交给服务器并获得对帐户的访问权限.

简单来说,如果提交的哈希(与提交的哈希相同)是通过应用程序中的任何其他漏洞泄漏(例如,通过SQL注入),那么应用程序就会有一个漏洞,其中不足以保护密码.

如果必须修复底层漏洞,则必须将提交的哈希值作为明文密码处理,然后在与存储的哈希值进行比较之前对其进行哈希处理(最好使用salt).

  • `客户端的哈希不能完全保护密码`嗯,没有什么能保护密码_completely_.如果你的攻击者愿意每分钟杀死一个孩子,直到你让他们在你的wordpress博客上发帖,假设你最终会让他们上传所有这些猫图片.重点是保护密码_more_,你的答案显然是'不'.`密码以明文形式存储,用于所有实际目的.不,不是.**身份验证令牌**是纯文本,但**密码**是隐藏的. (2认同)

Geo*_*fin 5

我认为在一种情况下这是有道理的;您甚至不想知道客户端的明文密码。如果您在客户端进行散列,则以与明文密码相同的方式加盐并迭代散列该散列。除此之外,它有点傻。