Php 有没有办法在客户端验证javascript文件的完整性?

Php 有没有办法在客户端验证javascript文件的完整性?,php,javascript,security,ssl,Php,Javascript,Security,Ssl,我正在研究一种安全的用户注册和身份验证方法,使用php和javascript,而不是ssl/tls 我意识到这可能被认为是一项不可能完成的任务,之前已经尝试过1000次了,但无论如何我还是要尝试一下。我在网上看到的每一个声称这样做的例子似乎都有一些巨大的致命缺陷 无论如何,我当前的问题是在客户端验证javascript。问题是,如果我在javascript中的sha1实现被中间的某个人修改,那么它根本就不安全。如果我能确认收到的javascript没有被篡改,那么我想我可以做到这一点 但真正的问

我正在研究一种安全的用户注册和身份验证方法,使用php和javascript,而不是ssl/tls

我意识到这可能被认为是一项不可能完成的任务,之前已经尝试过1000次了,但无论如何我还是要尝试一下。我在网上看到的每一个声称这样做的例子似乎都有一些巨大的致命缺陷

无论如何,我当前的问题是在客户端验证javascript。问题是,如果我在javascript中的sha1实现被中间的某个人修改,那么它根本就不安全。如果我能确认收到的javascript没有被篡改,那么我想我可以做到这一点

但真正的问题是,在客户端做事情的唯一方法是javascript。简单:编写一个javascript来验证其他javascript文件的完整性。不!中间的人也可以修改这个文件


有办法解决这个问题吗?

因为它们在客户端,所以您无法访问它们

这就是网页的本质


尝试在服务器端使用重要的东西…

这是没有办法的。正如您所说:如果您无法验证源代码,中间人攻击者可以替换客户端接收到的任何内容,即客户端解释和执行的任何内容。

要保护您的JavaScript,您必须在保证不受干扰的环境中检查它。由于无法在浏览器中创建这样的环境,因此这是不可能的。您最好的选择是通过HTTPS下载JavaScript。这不安全,但更好。可能的攻击向量:

  • 病毒可以修改浏览器,为每个页面加载恶意JavaScript
  • 键盘记录器可以监视用户输入的内容
  • 代理可以充当HTTPS连接的中间人。代理将实际解码您通过HTTPS发送的内容,并为浏览器再次编码(使用不同的证书)
  • 代理可以向您发送的页面添加iFrame

如果你的安全体系结构需要在Javascript中运行函数,那么你的安全性是有缺陷的。

< P>你说你唯一的问题是中间的人修改你用来执行Sa1的JavaScript。因此,我猜您正在使用用户名+密码的SHA1进行登录

即使没有Javascript篡改,这也是完全不安全的。即使中间人不知道普通密码,如果没有修改JavaScript,他将知道哈希,他可以完全使用哈希来通过重放来自己执行登录。 即使你包含了一个盐或随机数,中间的人现在仍然可以使用这些令牌,甚至通过执行密码/电子邮件更改来窃取帐户。 即使忽略了这一点,并且假设您实际上可以绕过所有这些+实际获得一个javascript来测试第二个javascript的完整性,您如何防止“验证脚本”也被篡改?您一直依赖通过不安全通道发送的脚本来确保此类数据的安全性(并且可以递归地继续使用检查脚本完整性的脚本来检查脚本的完整性…),所有这些脚本都被完全篡改,因为它们是通过不安全通道发送的


要做到这一点,唯一的方法是能够在http之上为自己构建一个安全通道,这需要一些客户端附加功能(Firefox插件/ActiveX扩展),但对https的本机支持太荒谬了。

使用JavaScript可以防止被动网络攻击(如窃听WiFi流量),但是,如果入侵者能够控制HTTP响应头和正文数据,则无法保护自己免受主动网络攻击

如果您不想为SSL证书付费,可以创建一个自签名证书。然而,这只能防止被动网络攻击,但比您曾经创建的一些黑客JavaScript实现要容易得多

本质上,您需要一个CA签名的SSL证书来防止主动网络攻击(中间的人)。


我相信(尽管有反对者),你的要求不是不可能的,只是极其困难。您要问的是,完全可以被滥用的代码允许用户向服务器标识自己,反之亦然。一种可能的方法是使用零知识证明,它不会向窃听者(Eve)泄露任何信息。例如,服务器可能提供javascript,该javascript绘制一个图形表示,该图形将用户提供的对Eve没有价值的信息与服务器提供的也没有价值的信息结合起来。javascript可能已被修改,但要么无法提供正确的图形(此时用户离开),要么成功。在后一种情况下,用户同样提供“零知识”证据,证明他们具有图的同构表示;同样,这不是成功就是失败。再看看SRP协议,但问题是它是一个专利雷区。参见Ferguson和Schneier的实用密码术。Jo

只有当且仅当服务器和客户端以前共享一个秘密时,才能在客户端验证Javascript文件的完整性。互联网上的情况往往并非如此。如果这样的秘密不可用,那么任何验证传输的Javascript的尝试都可能被破解。这是一个两难的局面

大多数情况下,人们希望确保JS的完整性,因为这让他们觉得可以在客户端委托安全检查。在密码学中,有一条基本规则不应该被打破:永远不要相信远程用户输入。总是反复检查


SSL/TLS可以使中间人攻击更难实现,但它不是无懈可击的。

如果我使用https,我将使用它完成整个过程,而不仅仅是使用java