客户端密码哈希与纯文本

时间:2015-06-09 04:47:47

标签: security hash passwords client password-hash

我正在组建一个Android客户端(可能在未来的iOS,门户网站等)和php mysql服务器。服务器端我目前正在使用PHPass库对传入的密码进行哈希和加密。

我是否应该让客户端通过HTTPS / SSL发送纯文本密码,或者客户端是否应该首先进行某种形式的散列。例如,每个客户端应该只是sha1(或其他一些算法)每个传出密码?

2 个答案:

答案 0 :(得分:3)

大多数网站将通过加密连接SSL / HTTPS发送密码纯文本。散列密码客户端可以完成,但优势很小,而且客户端语言(JavaScrypt)通常很慢,所以你可以在同一时间计算更少的轮次,这会削弱散列。在每种情况下,服务器也必须计算哈希值才是安全的。

优点很小,因为如果攻击者可以进行ManInTheMiddle攻击,他还可以修改/删除执行散列的脚本(JS)。只有使用SSL / HTTPS的加密连接才能防止MITM攻击,因此无论如何都需要SSL。

对于应用的情况,它看起来略有不同。由于用户首先必须安装您的软件,因此无需向客户端发送脚本,因此MITM无法修改此脚本。此外,应用程序可以相对快速地计算哈希值(如果它可以运行本机代码),因此可以在客户端进行足够的轮次。

这就是我要做的事情:

  1. 为方便起见,请通过加密的SSL / HTTPS连接发送密码纯文本,并像现在一样计算缓慢的BCrypt哈希服务器端。
  2. 只有当服务器上的负载变得过重时,您才可以将慢速BCrypt哈希的计算移动到客户端应用程序。仍然使用HTTPS发送哈希值,然后在服务器上计算额外的快速哈希值(例如SHA-256)。这更复杂,因为你必须单独交换和存储盐。

答案 1 :(得分:1)

客户端上散列密码的另一个缺点是,无需更新客户端就无法更改散列算法或迭代计数。

对于没有问题的JavaScript客户端,但您无法轻易保证您的用户将使用最新版本的本机客户端。

所以我会坚持通过HTTPS发送普通密码。