使用hmac保护javascript客户端

时间:2010-11-23 02:29:42

标签: php javascript hmac ajax-push

我正在研究如何保护我正在处理的javascript应用程序。该应用程序是一个聊天客户端,它使用APE(Ajax Push Engine)作为后端。

目前,任何人都可以访问该页面并向APE服务器发出GET / POST请求。我只想为注册用户提供聊天客户端,我想确保只接受他们的请求。我可以使用PHP的用户名/密码验证来为用户提供页面。但是一旦他们有了这个页面,有什么能阻止他们修改javascript或让它落到坏人手中?

这种保护客户端/服务器应用程序的方法看起来很有希望:http://abhinavsingh.com/blog/2009/12/how-to-add-content-verification-using-hmac-in-php/

我有另一个消息来源说这是javascript客户端的理想选择,因为它不依赖于发送私钥。但这怎么可能呢?根据上面的教程,客户端需要提供私钥。这似乎不太安全,因为拥有javascript的任何人现在都拥有该用户的私钥。根据我的理解,它会起到这样的作用:

  1. 用户使用用户名和密码登录
  2. PHP验证用户名和密码,查找用户的私钥并将其插入javascript
  3. Javascript提供签名(使用私钥),以及包含所有APE请求的公钥
  4. APE将计算出的签名与收到的签名进行比较,并决定是否处理请求。
  5. 如果javascript应用程序需要知道私钥,那么这是如何安全的?

    感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

答案:技术上cannot prevent the user from modifying the JavaScript。所以不要担心,因为你无能为力。

但是,您需要阻止的攻击是Cross-Site Request Forgery(CSRF)。不同域上的恶意脚本能够使用浏览器存储的cookie自动将表单提交到您的域。要解决这个问题,您需要在AJAX请求发送的实际数据中包含一个身份验证令牌(应该足够随机,与用户名或密码无关,并在聊天客户端所在的HTML页面中发送)(这不会被浏览器自动填写。

答案 1 :(得分:1)

  

如果javascript应用程序需要知道私钥,那么这是如何安全的?

为什么不呢?这是用户自己的私钥,所以如果他愿意把它交给别人,那就是他的问题。这与提供您的密码然后说其他人可以访问您的帐户没有什么不同。

如果你仔细想一想,你会发现你不需要实现公钥加密,HMAC或类似的东西。如果通信通道本身是安全的(比如使用HTTPS),那么基于会话的正常身份验证就可以。

答案 2 :(得分:0)

HMAC身份验证更适合第三方要连接的API。通过向客户端的浏览器写一个cookie来表明他们已经过身份验证,似乎可以更好地为您的应用程序提供服务。然后,对于每个ajax请求,您可以检查该cookie。

编辑:我收回了一些我所说的有关HMAC更好地服务于第三方API的内容。传统上,HMAC每个用户都有自己的私钥。我不认为这对您的申请是必要的。您可以通过保留一个主私钥并为每个用户提供一个唯一的“公共”密钥(我将其称为公钥,但实际上用户永远不会知道该密钥)来逃脱。当用户登录时,我会写两个cookie。一个是用户的公钥加密的时间戳和另一个说明时间戳是什么的键的组合。然后在服务器端,您可以验证加密密钥并检查时间戳是否在给定阈值内(例如10-30分钟,以防他们在您的应用程序中闲置)。如果他们已经过验证,请更新加密密钥和时间戳,然后冲洗并重复。