使用Phonegap(或等效的)包装的HTML5应用程序进行身份验证

mat*_*pop 5 javascript security android ios cordova

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

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

如果没有办法使用Phonegap或任何Cordova插件,你能否建议一个可以使这个东西成为可能的等效框架(或像Icenium这样的环境)?
或者,最后,如果不对上述情况采取这种预防措施,是否会有任何实际风险?

编辑:Kurt Du Bois提醒我,我没有提到SSL客户端身份验证.无论是否适用/方便,它总是会导致保密私钥的问题.我觉得这是很好的描述在这里,并在句总结:"该键尚未导出的保证是唯一的密钥存储本身一样强烈".

Gil*_*il' 8

应用程序是一个软件,而不是一个有形的对象.验证它的唯一方法是,如果该软件包含某种秘密.从服务器验证客户端,您请求客户端证明它知道该秘密.

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

你可以做的是用混淆技术使秘密难以提取.正确的混淆是非常困难的 - 如果他们有任何好处,可以为你的开发工作增加人工月数.如果你仍然可以使用调试器,那你就错了.混淆错误意味着浪费精力.模糊的努力意味着为某人提取数天或数周的工作来提取秘密.你需要问问自己这是否真的值得.从根本上说,混淆是把钥匙藏在门垫下面.如果你感觉很花哨,或者在花盆后面.

另请参阅安全堆栈交换的一些类似问题:如何为应用程序存储专用RSA密钥?; 在应用程序二进制中存储私有非对称密钥?


Fal*_*mot 6

要做到这一点,您需要从运行应用程序的意义开始.事实证明这是非常重要的,但我不会让每个人都讨论它.

如果运行你的应用程序意味着参与一些与你想要的行为相同的行为(黑盒定义),你可以通过在客户端上进行"阴影"计算(间歇或不断地)并检查结果来部分解决这个问题,给出相同的输入.甚至不要考虑为密码学做这样的事情,但它对于像游戏这样的东西来说相当不错,你可以根据用户输入定期审核客户端的行为.

您还可以将奇怪的行为引入应用程序(例如在游戏中创建不可见的精灵,如果客户端进行交互,则表示修改后的客户端).

在游戏反作弊世界中已经做了很多关于此类事情的工作,并非所有这些都涉及检查环境.

  • 这是非常重要的,有很多方法可以做到这一点.这样做的方法是依赖于应用程序; 没有一个有用的通用技术. (3认同)

Atu*_*td. -4

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

着手保护 HTML5 范例中的应用程序。我已经做了以下工作。

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

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

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

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

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

严格遵循编码标准。

通过加密 HTML,然后在 JNI 中转移解密机制,可以进一步加强安全性。

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

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

Android 团队和 IOS 团队并行工作,以确保两个平台的本机部分编码得到照顾。在IOS上,我们不需要使用加密和解密来通过客户端的安全合规测试。

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

  • “用复杂的密钥加密所有的 JavaScript 文件。(我用的是SHA2算法)”此时,你可能拥有的任何可信度都消失了。密钥并不“复杂”,它需要是随机的且保密的。SHA-2 与加密无关。总的来说,您所做的就是针对问题提出一些流行语并建立一些安全剧场,但实际安全性为零。 (9认同)
  • 这到底是怎么得到赏金的?这基本上是一个关于滚动你自己的 JS 混淆的建议,并没有真正解决给定的问题(这恰好是棘手的)。 (8认同)
  • 我们俩都这么做了,大约在评论的同时。你可以向任何你想要的东西授予赏金,@matpop…看到它走向如此错误的地方真是令人难过。 (6认同)
  • 还值得指出的是,sha2 不是加密,散列也不是密钥。 (3认同)
  • 不幸的是我意识到这些框架缺乏安全方面的问题。为了包括安全方面,必须采用混合实施模式。混合模式需要特定框架支持的所有平台的本机代码,因此我认为框架开发人员会避免这种路线。但将来我们可能会看到更成熟的框架。 (2认同)