【问题标题】:Verify if app is mine on server side验证应用程序是否在服务器端是我的
【发布时间】:2013-06-18 07:14:43
【问题描述】:

我正在编写一个铃声库应用程序,其中铃声驻留在服务器上,并且可以由用户下载。

我想要检查并验证连接是否真的来自我的应用程序而不是其他应用程序或 HTTP 请求生成器。例如,我不喜欢有人编写一个使用我的后端并在应用程序中展示他的广告的应用程序。这就像网站中的图像浸出,通过检查引用者来防止。

无法在应用程序中插入密钥,因为 android 应用程序很容易被反编译。我想过获取应用签名并将其哈希作为密钥发送,但这就像任何应用都可以访问其他应用的签名哈希一样。

如何编写应用程序的一部分以本机代码进行通信?是不是像java代码一样容易反编译?

我真的想不出任何其他方式,我不喜欢别人利用我的资源谋取利益。

【问题讨论】:

  • 不可能绝对确定该应用是您的 - 请参阅 herehere。如果您真正要问的是如何合理地确定该应用程序是您的,换句话说,其他 Android 开发人员使用什么最佳实践,那么我也想知道答案...
  • @DevOfZot 我已经看到了这两个链接,这不是一种安全的方法。除了使用 https 之外,如何在本机代码中实现应用程序的通信部分。我认为反编译本机代码比使用 dex2jar 轻松反编译的 java 困难得多?

标签: android


【解决方案1】:

您可以做几件事。

  1. 创建您自己的证书颁发机构,为您的应用提供证书并使用双向 TLS 身份验证。这并不能防止反编译和逆向工程,但可以保护途中的流量。
  2. 使用this 幻灯片中的建议来检测修改和调试器。
  3. 使用 Jelly Bean 的硬件支持 secure storage

不过,归根结底,DRM 是一场失败的战斗。如果用户具有 root 访问权限,则无论是否进行混淆(哪些本机库是),所有赌注都将关闭。唯一的问题是您的数据有多重要。对于 90% 的应用程序,通过 ProGuard 运行它几乎不可能解开(尤其是如果您使用数据流混淆)。与证书方法一起,这应该足以满足大多数情况。

或者,尝试更改您的模型,以便您验证用户而不是应用程序 - 这要简单得多!

【讨论】:

  • 怎么样?它不是灵丹妙药,它仍然可以反编译,只是有点难。你没有让任何东西变得“安全”,只是混淆了一些东西,让整个应用程序更难维护。
  • 所以,一般没有办法。
  • 无,如果设备已植根。根据我列出的要点,您将非常接近无根设备上的任何消费者数据的牢不可破。根据您的问题级别(没有冒犯的意思),我怀疑数据不会那么安全。顺便说一句,我银行的应用程序大量使用 ProGuard,并根据第一原则实现了自己的 RSA 加密(您可以从 base64 中的 REST API 获得 e 和 n)。这当然对安全性没有任何帮助,但它使得逆向工程非常困难(我已经放弃了我的随意尝试)。
猜你喜欢
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多