使用JavaScript加密模块而不是SSL/HTTPS

使用JavaScript加密模块而不是SSL/HTTPS,javascript,google-app-engine,ssl,Javascript,Google App Engine,Ssl,使用JS加密库而不是SSL进行安全通信是否值得?我问这个问题是因为我想保护我在谷歌应用引擎上构建的应用程序,它不允许您使用自己的域进行SSL请求。与GAE安全通信的好方法是什么?谢谢。Javascript是一种客户端语言,这意味着它在用户的浏览器中运行,因此任何用户都可以随意更改、操作和禁用它;使加密无效 编辑:你不是指Java吗?你必须使用https,但你不能在自己的appengine域上使用它。他们说他们很快就会增加这种能力。我们一直在使用恼人的https appspot域,假设他们真的会添

使用JS加密库而不是SSL进行安全通信是否值得?我问这个问题是因为我想保护我在谷歌应用引擎上构建的应用程序,它不允许您使用自己的域进行SSL请求。与GAE安全通信的好方法是什么?谢谢。

Javascript是一种客户端语言,这意味着它在用户的浏览器中运行,因此任何用户都可以随意更改、操作和禁用它;使加密无效


编辑:你不是指Java吗?

你必须使用https,但你不能在自己的appengine域上使用它。他们说他们很快就会增加这种能力。我们一直在使用恼人的https appspot域,假设他们真的会添加对https自定义域的支持,但与此同时,我们的(~75)个客户都没有抱怨appspot的事情


我想真正的问题是有多少人因为appspot的事情而不是客户。。。但我怀疑这是一个小数目。

不,这不值得,因为您必须以某种方式将Javascript代码发送到客户端。攻击者可以简单地修改Javascript,使其能够读取(或修改)所有通信,从而使您的所有保护无效。SSL确实是唯一的选项。

[注意:请参阅下面的更正]

可以通过自定义域安全地与google app engine上经过身份验证的服务器通信,但这很麻烦。正如其他一些答案所表明的,您必须非常小心如何实现加密以防止中间人攻击

下面是python的基本说明,但是您可以修改java。预计至少要花一两天的时间来安装和运行类似的东西

先决条件:

  • 用于服务器的python RSA和AES库。在GAE上效果很好
  • 要在客户端上运行的javascript RSA和AES库。我用和换了AES。我不记得为什么我不只用一个图书馆
说明:

  • 步骤1:脱机创建RSA公钥和私钥对。这里有一些说明

  • 步骤2:将生成的RSA公钥和私钥保存在python文件中,确保私钥不可公开访问

  • 步骤3:在服务器上,创建一个生成javascript文件的请求。javascript文件应该只向客户端传输公钥。例如,它将仅返回包含以下内容的文件:

    var public\u key=“[此处为您的公钥]”

  • 步骤4:在
    app.yaml
    文件中,确保生成的javascript文件仅通过SSL提供(即设置
    secure:always
    )。看

  • 步骤5:在客户端上,使用ssl加载javascript文件。但是,不要使用自定义域,而是使用appspot域。例如,将以下内容添加到html文件:

客户端现在将拥有经过身份验证的RSA公钥,以防止中间人攻击。注意:浏览器通常禁止访问其他域以防止访问,但存在允许加载javascript文件的漏洞

  • 步骤6:在客户端上,生成一个随机私钥。使用a和我们在步骤4中获得的公钥对随机私钥进行加密。将加密的私钥发送到服务器

  • 步骤7:在服务器上,使用RSA私钥解密客户端上生成的随机密钥

    此时,服务器和客户端都具有相同的私钥。更好的是,因为原始公钥是通过SSL传输的,所以我们可以验证服务器是否真的是我们所相信的服务器(即中间没有人)

  • 步骤8:现在,服务器和客户端可以使用随机生成的私钥及其各自的AES库加密和解密他们想要的任何数据

--编辑:更正--


布鲁诺下面的评论是100%正确的,上面的步骤是不安全的。尽管上面的步骤确实可以在客户端和服务器之间设置经过身份验证的会话,但用户真正知道它经过身份验证的唯一方法是检查代码以确保使用https加载公钥。中间的一个人可以提供最初的html页面修改
我不得不说不。JS encryption!=SSL。SSL给了你很多好处,比如没有信誉(客户可以相信你是你所说的人),以及保护中间人攻击。JS cypto库不是一个好主意,因为SSL为你做了这么多。@russau:虽然正是因为“无法使用自己的域进行HTTPS”的事情,GAE不让客户相信你就是你所说的你。它让客户相信你是谷歌(即他们正在与谷歌交谈),因为证书上是谷歌的名字。他们可能还认为谷歌代表的是你所说的你自己,但如果是这样,那不是因为SSL已经证明了这一点。因此,更重要的问题,实际上是如何在我自己的域名上,而不是在appspot.com上,确保客户机和我的GAE应用程序之间的连接安全,而使用JS库是其中一个想法。所以,我想我应该更好地了解如何处理appspot限制,而不是使用JS加密库。谢谢。任何用户也可以更改、操作和禁用他们的SSL连接端。Javascript在这里是无用的,但不是因为用户可以修改它。尼克,启用安全性是用户的选择,这是为了他们自己的利益。JS是个糟糕的选择,因为它可能会因为其他原因被禁用,讽刺的是,它通常是因为安全原因被禁用的。那么,如何更好地设计我的应用程序来处理appspot.com上的https呢?我应该如何组织它?谢谢。@Sergey你不必改变架构