我目前正在尝试创建以下用户授权: The definitive guide to form-based website authentication 我已经实现了 crsf token ,密码在数据库中加密等。现在我需要对在用户登录时发送的数据添加一些加密(不能使用 SSL)。
我一直在寻找一些好的解决方案,但我只找到了: http://unitstep.net/blog/2008/03/29/a-challenge-response-ajax-php-login-system/ 我不是安全专家,所以我不想自己编写这样的系统(但我想我必须这样做)。
你知道任何提供挑战-响应功能的类/库吗? 数据在发送到服务器之前必须在客户端进行哈希处理 - 从定义上讲这不是不安全吗?
最佳答案
看完 unitstep.net 上的文章后,它看起来确实很有趣。
质询是一个加密的随机数,这意味着只发送一次给客户端,在成功登录后,它就失效了,所以如果有人嗅探连接并且他们收到了质询和响应,它就不会工作,因为下次会有所不同。就登录凭据而言,嗅探连接的人将无法通过使用登录期间发送的数据来破解您的登录信息。
然而,当不使用加密连接时,还有其他缺点。我能想到的一些是:
- 如果黑客得到了挑战和您的响应,他们可以对其执行字典/暴力攻击以检索您的密码。如果使用较差(快速)的加密技术并使用简单的密码,这可能会相对较快地完成,因此请确保使用较慢的算法,或者如果算法较快则使用多轮以达到减慢效果。
- 此方法不提供身份验证,这可能会导致中间人攻击。
- 由于它是在客户端完成的,因此您无法控制密码强度。如您所知,他们可能使用的是空字符串。
- 黑客可以嗅探用户在登录时的行为
- 您的网站将更容易受到 session 劫持
- 即使您的登录凭据本身是安全的(因为它们永远不会传输),下一个挑战总是提前以纯文本形式存储在数据库中。
有效的 SSL 证书并不昂贵。快速搜索“便宜的 ssl 证书”找到了一些低于 10 美元/年的匹配项(大约是您的域名成本)。如果可以的话,这绝对是您要走的路。
现在,回答您的实际问题:
Do you know any class / lib that provides challenge-response feature?
不,对不起。
Data must be hashed at client side before sending to server - isn't that unsafe by definition?
我不明白这怎么会不安全。我看到一些网站实现了浏览器端证书登录(例如 http://www.startssl.com 和 Webmin 也有相同的功能)。浏览器计算出证书对,并将公钥发送给服务器进行认证。
编辑 2016:
如果您正在寻找完全免费的 SSL 证书,我强烈推荐 https://letsencrypt.org/ .我目前将它们用于大约 10 个域而没有问题,并且使用简单的 cron 作业自动更新证书,所以现在我基本上再也不用担心证书了。他们也接受 donations我会鼓励任何使用它们的人这样做,尤其是因为它们为您节省了大约 10 美元/年每个域。
关于php - 创建挑战响应登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743887/