代码之家  ›  专栏  ›  技术社区  ›  Matt

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

  •  2
  • Matt  · 技术社区  · 15 年前

    我正致力于开发一种安全的用户注册和身份验证方法,使用PHP和JavaScript,但不使用SSL/TLS。

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

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

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

    有办法解决这个问题吗?

    8 回复  |  直到 14 年前
        1
  •  2
  •   Aaron Digulla    15 年前

    为了保护您的javascript,您必须在一个有保证的、无限制的环境中检查它。因为您不能在浏览器中创建这样的环境,所以这是不可能的。你最好的选择是通过https下载javascript。这不安全,但更好。可能的攻击向量左:

    • 病毒可以修改浏览器为每个页面加载一些恶意的javascript。
    • 键盘记录器可以监视用户键入的内容
    • 代理可以充当一个中间人来连接HTTPS。代理将对您通过HTTPS发送的内容进行解码,并为浏览器再次编码(使用不同的证书)。
    • 代理可以向发送的页面添加iframe
        2
  •  2
  •   Jo.    15 年前

    马特 我相信(尽管反对者)你所要求的并不是不可能的,只是非常困难。您要问的是,完全可以被滥用的代码允许用户在服务器上标识自己,反之亦然。一种可能的方法是使用零知识证明,它不会向窃听者(EVE)泄露任何信息。例如,服务器可能提供一个javascript,它绘制一个图形的表示,该图形将用户提供的无值信息单独组合到EVE中,而服务器提供的信息也没有值。javascript可能已经被修改过,但要么无法提供正确的图表(此时用户离开),要么成功。在后一种情况下,用户同样提供了“零知识”证据,证明他们具有图的同构表示;同样,这要么成功,要么失败。另外,看看SRP协议,但问题是它是一个专利雷区。参见弗格森和施耐尔的实用密码术。乔

        3
  •  1
  •   VolkerK    15 年前

    这是不可能的。如你所说:如果你不能验证来源,中间的人会攻击你。 可以 替换客户机接收到的任何内容,即客户机解释和执行的任何内容。

        4
  •  1
  •   Johnco    15 年前

    你说你唯一的问题是一个中间人修改你用来执行sha1的javascript。因此,我猜您正在使用用户名+密码sha1登录….

    这是完全不安全的,即使没有javascript篡改。即使中间人可能不知道简单的密码,如果不修改javascript,他将知道散列,他可以完全使用散列来执行自己的登录,只需重放它。

    即使您包含salt/nonce,中间的人现在仍然可以使用这些令牌,甚至可以通过执行密码/电子邮件更改来窃取帐户。

    即使忽略了这一点,并且假设您实际上可以绕过所有这些+实际获得一个javascript来测试第二个javascript的完整性,您如何防止“验证脚本”也被篡改?您一直依赖于通过不安全通道发送的脚本,以确保这些数据的安全性(并且可以递归地继续使用检查脚本完整性的脚本,检查脚本的完整性…)所有这些都被完全篡改,因为它们是通过不安全通道发送的。

    唯一的方法是在HTTP之上建立一个安全的通道,它需要一些客户端附加程序(一个火狐插件/一个ActiveX扩展),但是拥有对HTTPS的本机支持,这是非常荒谬的。

        5
  •  0
  •   Ozan BAYRAM    15 年前

    因为它们在客户机中,所以您无法访问它们。

    这就是网页的本质…

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

        6
  •  0
  •   TravisO    15 年前

    如果您的安全体系结构以某种方式要求在javascript中运行函数,那么您的安全就有缺陷。

        7
  •  0
  •   Tower    15 年前

    有了javascript,人们可以抵御被动网络攻击(例如窃听WiFi流量),但如果入侵者能够控制HTTP响应头和主体数据,您就无法保护自己免受主动网络攻击。

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

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

        8
  •  0
  •   Jérôme Verstrynge    14 年前

    只有在服务器和客户机以前共享秘密的情况下,并且只有在服务器和客户机以前共享秘密的情况下,才能在客户机上验证javascript文件的完整性。在互联网上,情况往往不是这样。如果这样的秘密不可用,那么任何验证传输的javascript的尝试都可能被破坏。这是一个第22种情况。

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

    ssl/tls可以使中间人攻击更难实现,但它并非无懈可击。