我正在组建一个Android客户端(可能在未来的iOS,门户网站等)和php mysql服务器。服务器端我目前正在使用PHPass库对传入的密码进行哈希和加密。
我是否应该让客户端通过HTTPS / SSL发送纯文本密码,或者客户端是否应该首先进行某种形式的散列。例如,每个客户端应该只是sha1(或其他一些算法)每个传出密码?
答案 0 :(得分:3)
大多数网站将通过加密连接SSL / HTTPS发送密码纯文本。散列密码客户端可以完成,但优势很小,而且客户端语言(JavaScrypt)通常很慢,所以你可以在同一时间计算更少的轮次,这会削弱散列。在每种情况下,服务器也必须计算哈希值才是安全的。
优点很小,因为如果攻击者可以进行ManInTheMiddle攻击,他还可以修改/删除执行散列的脚本(JS)。只有使用SSL / HTTPS的加密连接才能防止MITM攻击,因此无论如何都需要SSL。
对于应用的情况,它看起来略有不同。由于用户首先必须安装您的软件,因此无需向客户端发送脚本,因此MITM无法修改此脚本。此外,应用程序可以相对快速地计算哈希值(如果它可以运行本机代码),因此可以在客户端进行足够的轮次。
这就是我要做的事情:
答案 1 :(得分:1)
客户端上散列密码的另一个缺点是,无需更新客户端就无法更改散列算法或迭代计数。
对于没有问题的JavaScript客户端,但您无法轻易保证您的用户将使用最新版本的本机客户端。
所以我会坚持通过HTTPS发送普通密码。