【问题标题】:Authenticate HTML5 application wrapped with Phonegap (or equivalent)验证使用 Phonegap(或等效项)包装的 HTML5 应用程序
【发布时间】:2014-03-01 23:33:54
【问题描述】:

有没有办法只使用 JavaScript(客户端)来确保 HTTP 请求实际上来自我的 Phonegap 应用程序?
请注意:我不是在谈论验证用户,而是在某种意义上说验证应用程序本身。没有(也不应该)与此相关的任何类型的用户交互。
甚至没有谈论通信的机密性(我没有使用 HTTPS 并且有效负载没有加密)。

我的猜测是,最终,这不可避免地需要某种硬编码密钥
问题是,正如您所见,例如 here,几乎任何人都可以访问这样的密钥 - 这个问题不仅出现在 Javascript 资产中,还出现在 Android 中的 Java 上。

如果无法使用 Phonegap 或任何 Cordova 插件,您能否建议一个等效的框架(或像 Icenium 这样的环境)来使这件事成为可能?
或者,最后,在上述情况下不采取这种预防措施会有任何真正的风险吗?

编辑:Kurt Du Bois 提醒我我没有提到 SSL 客户端身份验证。无论它是否适用/方便,它总是以保密私钥的问题告终。我发现 here 对此进行了很好的描述,并总结为一句话:“密钥没有被导出的保证与密钥存储本身一样强大”。

【问题讨论】:

    标签: javascript android ios security cordova


    【解决方案1】:

    应用程序是一个软件,而不是有形的对象。验证它的唯一方法是该软件是否包含某种秘密。从服务器上,要对客户端进行身份验证,您要求客户端证明它知道秘密。

    如果您允许任何人下载您的应用程序,那么它包含的任何数据都不是秘密。所以你无法验证你的应用程序。

    您可以做的是使用混淆技术使秘密更难提取。正确地进行混淆是非常困难的——如果要获得任何好处,就需要在您的开发工作中增加几个月的时间。如果您仍然可以使用调试器,那么您做错了。错误的混淆意味着浪费精力。混淆工作意味着增加几天或几周的工作让某人提取秘密。你需要问问自己这是否真的值得。从根本上说,混淆就是把钥匙藏在门垫下面。或者如果你喜欢花盆的话。

    另见Security Stack Exchange上的一些类似问题:How to store a private RSA key for an application?Storing private asymmetric key in application binary?

    【讨论】:

      【解决方案2】:

      要做到这一点,您需要先明确定义运行应用程序的意义。事实证明这是不平凡的,但我不会因为讨论它而让每个人感到厌烦。

      如果运行您的应用程序意味着以与您的意图相同的行为(黑盒定义)参与某些进程,您可以通过“隐藏”客户端上完成的计算(间歇性或持续性)并检查结果,给定相同的输入。甚至不要考虑为密码学这样做,但它适用于诸如游戏之类的事情,您可以在给定用户输入的情况下定期审核客户端的行为。

      您还可以在应用程序中引入奇怪的行为(例如在游戏中创建一个不可见的精灵,如果该精灵作为客户端交互的目标,则表明客户端已修改)。

      在游戏反作弊的世界里,这类事情已经做了很多工作,并不是所有的工作都涉及到环境检查。

      【讨论】:

      • 请提供有关该方法以及如何执行此操作的更多详细信息。问题是关于 html5 和实现基于 html5 的框架,如 phonegap...
      • 这很重要,有很多方法可以做到。实现方式取决于应用程序;没有有用的通用技术。
      • 我希望您至少说明一种方法。它肯定会帮助提出问题的人。至少举一个 Android 或 iOS 的例子。问题再次与 Phonegap 和 html5 框架有关。您的回答甚至没有触及。如果您提供一些有关 Android、Phonegap 和 iOS 相关答案的具体信息,将会非常有帮助。
      • @AtulDravid-WhitePvt.Ltd. Falcon 是个好人——我相信他很乐意分析您选择的应用程序,并就如何为该应用程序实施适当的客户端身份验证提出建议。我也相当肯定他会期待一些有价值的回报——一份合同和一些钱是在这些情况下的传统补偿。
      【解决方案3】:

      在更高的层次上工作怎么样:公钥/私钥通信。这样您就可以进行 SSL 加密连接,而无需进行必要的身份验证。

      这种工作方式的可能缺点是,当您的手机被盗或购买新手机时,您必须生成新密钥。

      【讨论】:

      • 这是一种实现技术(也是正确的),但它只允许您验证用户或设备,而不是应用程序。如果有人创建了私钥并提交了对应的公钥,你无法知道它不是由应用程序生成的。
      【解决方案4】:

      我不知道,如何做到这一点,但我有一些想法,只是与你分享。 HTMl DOM 在 Web 浏览器上运行时由 Web IDL 转换。

      尝试将html5文件转为WEB IDL并尝试寻找加密方式。因为我也搜索了很长时间。我没办法。 WEB IDL 的在线验证器是http://www.w3.org/2009/07/webidl-check

      我不知道这可能与否,让我们试试,如果我找到任何解决方案,请告诉你。

      【讨论】:

        【解决方案5】:

        对安全的严格要求在许多垂直行业中非常普遍。我发现如果不遵循适当的指导方针,android 应用程序很容易受到威胁。为了确保可靠的安全机制,完全控制我在项目中所做的安全性。

        在 HTML5 范例中保护我的应用程序。我已经完成了以下操作。

        1. 将 html 和 javascript 编码在单独的文件中。我们确保 html 代码不会嵌入 javascript。 (至少不会有敏感的java脚本)

        2. 编写了一个外部 java 程序来加密所有带有复杂密钥的 javascript 文件。 (我使用了 SHA2 算法)。在发布到生产环境中,加密的 javascripts 包含在 Asset 文件夹中。

        3. 创建了一个基于 JNI 的程序以将密钥存储在变量中,并提供了检索此密钥的方法。

        4. 在Native Android中编写了方便的方法来做以下操作

          • 打开 Html 文件。
          • 在 htmlBuffer 中读取 Html 文件。
          • 查找脚本标签。
          • 读取 javaScriptBuffers[] 中脚本标记中指定的 javascript 文件。
          • 使用 JNI 从 .so 中获取复杂密钥。 (参考第三步)
          • 解密 javaScriptBuffers[] 中所有加密的 javascript。在解密之前检查特定的 javascript 是否已加密。
          • 用 htmlBuffer 中的 javaScriptBuffers[] 中的实际 javascript 替换 Script 标签。
          • 在网页视图中加载 html 文件。

        严格遵循编码标准。

        加密的 HTML 也可以进一步加强安全性,然后在 JNI 中转换解密机制。

        我的应用程序已通过上述方法的严格安全评估。

        简而言之,我没有依赖任何框架,而是自己开发了一个我可以 100% 控制的小框架。一旦设计被正确理解并且开发人员接受了几次培训,没过多久。

        android 团队和 IOS 团队并行工作,以确保在两个平台上都考虑到编码的 Native 部分。在IOS上,我们不需要使用加密和解密来通过客户端的安全合规性测试。

        第一个应用程序的开发时间稍长,但一旦框架到位,接下来的应用程序只需编写 html 和 javascript 代码,并在生产前遵循正确的发布流程。

        【讨论】:

        • 不幸的是,我意识到这些框架缺乏安全性。为了包括安全方面,必须采用混合实施模式。混合模式需要特定框架支持的所有平台的本机代码,因此我认为框架开发人员会避免这条路线。但在未来,我们可能会看到更成熟的框架可用。
        • “用复杂的密钥加密所有的javascript文件。 (我使用了 SHA2 算法)”此时,您可能拥有的任何可信度都将丢失。密钥并不“复杂”,它需要是随机的和保密的。 SHA-2 与加密无关。总的来说,您所做的只是在问题上抛出一些流行语并设置了一些安全剧院,但实际安全性为零。
        • 这到底是怎么得到赏金的?这基本上是对滚动您自己的 JS 混淆的建议,并不能真正解决给定的问题(这恰好是棘手的)。
        • 另外值得指出的是,sha2 不是加密,哈希也不是密钥。
        • 我们都这样做了,大约在评论的同时。你可以给任何你想要的赏金,@matpop... 看到它出了这么大的问题,我很难过。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多