有没有办法,只使用JavaScript(客户端),以确保HTTP请求实际来自我的Phonegap应用程序?
请注意:我不是在谈论验证用户,而是在某种意义上,关于验证应用程序本身。没有(也不一定是)任何与此相关的用户交互。
甚至没有谈论通信的机密性(我没有使用HTTPS,有效载荷也没有加密)。
我的猜测是,最终,这不可避免地需要某种硬编码密钥 问题是,正如您可以看到的那样here,几乎任何人都可以访问这样的密钥 - 这个问题不仅出现在Javascript资产上,还出现在Android中的Java中。
< p> 如果没有办法使用Phonegap或任何Cordova插件,你能否建议一个可以使这件事成为可能的等效框架(或像Icenium这样的环境)?编辑:Kurt Du Bois提醒我,我没有提到SSL客户端身份验证。无论是否适用/方便,它总是会导致保密私钥的问题。我发现这是很好的描述here,并在句子中总结:“确保密钥未被导出的保证仅与密钥存储本身一样强。”
答案 0 :(得分:9)
应用程序是一个软件,而不是一个有形的对象。验证它的唯一方法是,如果该软件包含某种秘密。从服务器验证客户端,您请求客户端证明它知道密码。
如果您允许任何人下载您的应用程序,那么它包含的任何数据都不是秘密。因此,您无法验证您的应用程序。
您可以做的是使用混淆技术使秘密难以提取。正确的混淆是非常困难的 - 如果他们有任何好处,可以为你的开发工作增加人工月数。如果你仍然可以使用调试器,那你就错了。混淆错误意味着浪费精力。模糊的努力意味着为某人提取数天或数周的工作来提取秘密。你需要问问自己这是否真的值得。从根本上说,混淆是把钥匙藏在门垫下面。如果你感觉很花哨,可以在花盆后面。
另请参阅Security Stack Exchange上的一些类似问题:How to store a private RSA key for an application?; Storing private asymmetric key in application binary?
答案 1 :(得分:7)
要做到这一点,您需要从运行应用程序的意义开始。事实证明这是非常重要的,但我不会让每个人都讨论它。
如果运行你的应用程序意味着参与一些与你想要的行为相同的行为(黑盒定义),你可以通过在客户端上进行“阴影”计算(间歇或不断地)和检查来部分解决这个问题。结果,给出相同的输入。甚至不要考虑为密码学做这样的事情,但它对于游戏这样的事情来说效果很好,你可以根据用户的意见定期审核客户的行为。
您还可以将奇怪的行为引入应用程序(例如在游戏中创建不可见的精灵,如果客户端进行交互,则指示修改后的客户端)。
在游戏反作弊世界中已经做了很多关于此类事情的工作,并非所有这些工作都涉及检查环境。
答案 2 :(得分:1)
如何在更高层次上工作:公钥/私钥通信。这样,您就可以拥有SSL加密连接,而无需进行必要的身份验证。
这种工作方式的可能缺点是,当您的手机被盗或购买新手机时,您必须生成新密钥。
答案 3 :(得分:0)
我不知道如何做到这一点,但我有一些想法,只是与你分享。 在Web浏览器上运行时,HTMl DOM由Web IDL转换。
尝试将html5文件转换为WEb IDL并尝试查找加密方式。因为我也长时间搜索这个。我没法道。 WEB IDL的在线验证器为http://www.w3.org/2009/07/webidl-check
我不知道这是否可能,让我们试试,如果我发现任何解决方案,请告知您。
答案 4 :(得分:-5)
严格的安全要求在许多垂直业务中非常普遍。我发现如果没有遵循正确的指导方针,android应用程序很容易受到威胁。为了确保可靠的安全机制,我完全控制了我在项目中完成的安全性。
要在HTML5范例中保护我的应用程序。我做了以下的事。
在单独的文件中编写html和javascripts。我们确保html代码不会嵌入javascript。 (至少不会有敏感的java脚本)
写了一个外部java程序来加密所有带有复杂密钥的javascript文件。 (我使用SHA2算法)。在Release to production中,加密的javascripts包含在Asset文件夹中。
创建了一个基于JNI的程序,用于将密钥存储在变量中,并提供了检索此密钥的方法。
在Native Android中编写了方便的方法来执行以下操作
严格遵守编码标准。
加密的HTML也可以进一步加强安全性,然后在JNI中转移解密机制。
我的申请已通过上述方法的严格安全评估。
简而言之,我没有依赖任何框架,而是自己开发了一个小框架,我可以100%控制它。一旦设计得到正确理解并且开发人员接受了几次培训,就没那么久了。
android团队和IOS团队并行工作,以确保编码的Native部分得到两个平台的关注。在IOS上,我们不需要使用加密和解密来通过客户端的安全合规性测试。
第一个应用程序的开发花费的时间更长,但是一旦框架到位,接下来的应用程序只是编写html和javascript代码并在生产之前遵循正确的发布过程。