如何正确应用客户端密码密码?

时间:2015-07-30 14:18:25

标签: security hash passwords

我正在寻找一种既定的安全机制来应用客户端密码散列以及服务器端密码散列。客户端是Web应用程序或移动应用程序。客户端和服务器之间的通信使用HTTPS。服务器应使用bcrypt或类似安全的密码散列算法。

现在,我不想将未加密的密码从客户端发送到服务器,以防止对用户的内部攻击。我想确保我们的管理员都无法获得原始密码,因为 - 众所周知 - 大多数人在多个网站上重复使用他们的密码或使用密码方案来获取易于密码的密码记住。

此外,我想在身份验证协议中实现额外的双因素安全层,利用存储在客户端上的秘密,以进一步增强整体安全性。

是否有任何已发布和验证的机制可用于此情况?

修改 在我的场景中,邪恶的管理员无法控制应用程序的代码。正在进行身份验证并提供敏感数据的服务器是REST服务器。应用程序代码由不同的服务器(用于Web应用程序)或通过AppStore(用于移动应用程序)提供。我还在考虑攻击者只能对连接HTTPS服务器和应用服务器的内部网段进行只读访问的情况。在大多数实际设置中,SSL终止是在专用服务器上完成的。

1 个答案:

答案 0 :(得分:0)

网站相比,使用应用的方案非常适合客户端哈希。该应用程序已经包含用于计算哈希值的代码,并且代码无法被截获/更改,因为JavaScript就是这种情况。更重要的是,您可以从CPU密集型计算中解除服务器的负担。

这些是注册的必要步骤:

  1. 在客户端,使用具有成本因子的慢哈希函数计算密码的哈希值。适当的算法是BCrypt,PBKDF2或SCrypt。大多数库将自己生成随机盐,并将其包含在生成的哈希值中。
  2. 将客户端哈希发送到服务器(您已经提到过SSL连接)。
  3. 在服务器端,再次计算发送的客户端哈希的哈希值。这次你不需要盐,你可以使用像SHA-256这样的快速算法。这是安全的,因为客户端哈希已经是一个非常强大的密码",不可能从服务器哈希中伪造客户端哈希。
  4. 从client-hash中提取salt,cost factor和algorithm等参数。
  5. 将server-hash和参数(salt,...)存储在数据库中。
  6. 以下是登录的步骤:

    1. 客户端必须要求存储在服务器上的数据库中的参数(salt,...)。
    2. 客户端使用与注册相同的参数计算密码的哈希值。
    3. 将客户端哈希发送到服务器。
    4. 服务器再次使用快速算法散列客户端哈希值,并将其与数据库中存储的哈希值进行比较。
    5. 这比单独的服务器端散列要复杂一些,因为你必须分别存储参数(salt,...)。