【问题标题】:Is there a way to verify the integrity of javascript files at the client?有没有办法在客户端验证 javascript 文件的完整性?
【发布时间】:2010-12-29 01:54:47
【问题描述】:

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

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

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

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

有没有办法解决这个问题?

【问题讨论】:

    标签: php javascript security ssl


    【解决方案1】:

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

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

    【讨论】:

    • 如果我要使用 https,我将使用它来完成整个过程,而不仅仅是使用 javascript。除非有一家公司会通过 https 为我提供我的 javascript。至于病毒,键盘记录器;没有什么可以做的!代理是指真正的代理服务器还是恶意的中间人?
    • @Matt:两者都有。一些公司配置他们的代理来解码流,以便他们可以检查 HTML 中的病毒、木马等。
    • 或访问playboy.com上的OSS下载页面等禁止网站。
    • 加载的初始页面可能已被活跃的网络攻击者修改为不包含任何通过 HTTPS 的 JavaScript。他可能会更改整个文档。
    【解决方案2】:

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

    【讨论】:

    • 您能详细解释一下吗?我理解零知识证明的想法,但绘制图表是什么意思?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      即使没有 Javascript 篡改,这也是完全不安全的。即使中间人在不修改 javascript 的情况下可能不知道普通密码,但他会知道哈希,并且他可以完美地使用该哈希来自己执行登录,只需重放它。

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

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

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

      【讨论】:

      • 我同意这不是一个理想的情况;我只是在探索可能性。与其说是可部署的系统,不如说是一种安全练习。关于你的第 4 段(“甚至忽略这个......”),整个递归验证检查就是我要问的。我明确表示我意识到了这个问题,并询问是否有办法解决它。显然目前没有。
      • 在本练习的规则中也不允许使用浏览器插件/扩展。是的,这里的想法是在 http 上建立某种安全通道,只是想看看没有 https 会发生什么。
      【解决方案5】:

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

      这是网页的本质...

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

      【讨论】:

        【解决方案6】:

        如果您的安全架构以某种方式需要在 Javascript 中运行的函数,那么您的安全性就有缺陷。

        【讨论】:

        • 我知道你来自哪里,但如果你能确保 javascript 没有被篡改,那为什么不呢?
        【解决方案7】:

        使用 JavaScript 可以保护自己免受被动网络攻击(例如窃听 WiFi 流量),但您无法保护自己免受主动网络攻击,因为入侵者能够控制您的 HTTP 响应标头和正文数据。

        如果您不想为 SSL 证书付费,则可以创建自签名证书。但是,这只会阻止被动网络攻击,但比您创建的一些 hacky JavaScript 实现要容易得多。

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

        【讨论】:

          【解决方案8】:

          只有当且仅当服务器和客户端先前共享机密时,您才能在客户端验证 Javascript 文件的完整性。在 Internet 上,大多数情况下并非如此。如果这样的秘密不可用,那么任何验证传输的 Javascript 的尝试都可能被破坏。这是第 22 条规定的情况。

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

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

          【讨论】:

            猜你喜欢
            • 2010-12-23
            • 2015-09-14
            • 2017-10-26
            • 2012-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-15
            相关资源
            最近更新 更多