有没有办法在Ajax中安全地发送信息?

时间:2011-04-20 13:53:21

标签: javascript ajax security jquery https

我目前正在开发基于HTML + JS的应用程序,几乎完全基于ajax连接(使用jQuery.ajax()调用来简化流程)。

我正在考虑在不使用HTTPS的情况下进行安全通话的最佳做法(至少目前是这样。我现在买不起证书)。

此时,我唯一关心的是注册和登录步骤。也许登录更容易一些。我想到发送用户名和时间戳,然后使用用户密码加密它们。因此,通过这样做,我不会发送任何密码(像在OAuth中一样保密)。服务器应检查用户,使用密码解密并将收到的时间戳与解密结果配对。服务器应将 nonce 类似的数字保存到数据库中(以避免重复攻击),然后将另一个唯一ID(使用用户密码加密)返回给用户。此时,用户应该开始使用该密钥加密他的所有信息(可能还有另一个nonce)并将其发送到服务器。如果您发现任何错误或泄漏,请纠正我。

对我来说最大的问题是注册。我不能用常规密码加密信息,因为如果我在javascript中这样做,任何人都可以知道密码。如果我提供临时生成的密码来加密并将其从服务器发送到客户端,那么任何嗅探器都可以获取它并用于解密信息。

我知道HTTPS可以挽救我的生命(也许这是唯一的解决方案),但此时我无法使用它。

还有其他解决方案,还是应该等到我可以使用HTTPS?请记住,如果我可以跳过等待,那就更好了。谢谢伙伴们!

4 个答案:

答案 0 :(得分:4)

简短回答:如果没有HTTPS

,就无法做到

更长的答案:如果您尝试在没有HTTPS的情况下执行此操作,您将发现自己尝试重现HTTPS旨在执行的所有操作。您可以在某个时刻达成目标,但相信您将成功实现HTTPS提供的1%是不切实际的。您将获得的唯一好处是一个模糊的安全机制(通过默默无闻的安全性),对于非关键系统可能没问题,但在真正的危急情况下可能会失败。

您可以创建自己的证书,然后使用与常规HTTP调用相同的方式使用Ajax。唯一的缺点是用户会收到警告信息。

答案 1 :(得分:3)

使用SSL证书是唯一真正的方法,如果你在javascript中加密它,任何人都可以读取代码并解密它。

http://www.startssl.com/

答案 2 :(得分:2)

  • 在服务器上生成公钥/私钥对,以及随机生成的盐。
  • 将密钥对和salt附加到用户会话对象。
  • 将公钥和salt发送到客户端代码。
  • 使用公钥和salt加密AJAX请求。

这不是一项微不足道的任务。您可能会发现购买证书更便宜,更有效。

编辑:这也意味着所有常规HTTP流量(HTML,图像,CSS等)都是以明文形式发送的。这可能是一个问题,因为它可能允许窃听者间接地弄清楚用户正在做什么。

答案 3 :(得分:0)

我想你应该看看:

http://assl.sullof.com/assl/

以下是项目的描述:

  

aSSL是一个在MIT License下分发的库,它实现了一种类似于没有HTTPS的SSL的技术。

     

aSSL使客户端能够使用RSA算法与服务器协商秘密随机128位密钥。建立连接后,将使用AES算法发送和接收数据。

     

aSSL由一些Javascript文件和服务器端组件组成。因为我最近将协商算法从RC4更改为RSA,所以目前只有一个纯Javascript(ASP)服务器组件可用。一旦库通过测试阶段,我将尽快为主要的Web语言(PHP,Java,Perl,Python,TKL等)进行移植。