在javascript中哈希密码以进行用户身份验证

时间:2014-01-24 14:43:13

标签: javascript security hash passwords

我一直在阅读与此相关的问题和答案,但没有人提出这个问题,是否有缺陷?

  1. 用户拥有我在服务器中存储的密码
  2. 他访问登录,我提供了一个明文随机字符串
  3. 登录页面中的javascript哈希密码,附加明文,重新整理整个字符串并将其发送到服务器
  4. 服务器从数据库获取散列密码附加明文,重新进行比较
  5. 我认为这种方法可以防止密码泄露和重放攻击,只要随机字符串不可预测且无法在合理的时间内重复使用。

    此算法是否有任何缺陷?

2 个答案:

答案 0 :(得分:1)

我看到的最大问题是你正在解决已经解决过的问题(通过SSL),如果你不在你的方案中使用SSL,你仍然会接触到man-in-the-中间和会话劫持漏洞。如果 已经使用SSL,那么这就是不必要的复杂性,而且正如我们所知,复杂性对安全性不利。

因此,算法中的缺陷是您没有保护通信通道。如果没有它,您的算法就不是特别安全了,因此,您的算法并不是特别必要。

答案 1 :(得分:0)

我同意之前关于使用SSL的答案,但我将在此专门讨论该算法。

要破解您的算法,攻击者需要执行以下操作之一:

  1. 了解用户的明文密码
  2. 了解用户的哈希密码
  3. 了解明文随机字符串加上双哈希密码
  4. 假设攻击者知道或可以猜测您使用的哈希算法。

    有几种方法可以实现(1)超出算法范围的方法。通用密码,密码重用等。

    散列密码(2)本质上也是一个密码,因为您将接受任何提交散列密码+随机明文的人。因此,如果攻击者可以在客户端或服务器上找到散列密码,那么他就可以登录到您的站点。

    (3)很有趣,并且可能是攻击向量。如果没有SSL,攻击者可以嗅探以找到(3)中的两个元素 - 他将听到来自服务器的随机明文,然后是双散列密码进入服务器。然后他可以使用密码猜测工具来确定原始密码。从常用密码列表开始,哈希,添加明文,然后再次哈希。破解所需的时间取决于密码的强度和散列算法的大小。他也可以尝试使用彩虹表来找到'哈希密码'+'随机明文'字符串。

    通过找到防止攻击者嗅探交换的方法,可以提高您的安全性。