我有一个用我的数据返回 JSON 字符串的 URL。现在,我想保密这些数据,所以只有我的 Android 应用程序可以显示它。
我的第一个想法是使用私钥(在服务器端)对数据进行编码,并将相同的私钥存储在应用程序中,这样它就可以解码消息。但是,攻击者(用户)可以反编译 .apk 并获取私钥。
- 你知道如何保护它吗?
- 反编译 Java 很简单。Android .apk 怎么样?我听说有一种叫做 ProGuard 的东西——Android 默认使用它吗?它是否保护代码?
这通常是做不到的:如果用户需要查看数据,他们必须能够对其进行解密等。您可以通过不将数据存储在磁盘等上来使其更难,但是确定的用户/攻击者可以转储内存,使用调试器等查看数据。首先考虑您要保护的威胁,然后决定采取的行动方案。
如果您只希望您的应用程序能够下载数据,则需要使用某种身份验证 + SSL。如果您在应用程序中对密钥或密码进行硬编码,则很容易将其提取出来,因此不会给您带来太多收益。如果您让用户每次使用该应用程序时都输入密码,他们会很快感到沮丧并留下一堆 1 星评级。中间立场是使用某种基于令牌的身份验证,例如 OAuth(或 ClientLogin,如果你真的需要,但它已被弃用)并让用户使用他们现有的帐户进行身份验证,这样他们就不会必须注册并记住另一个密码。大多数 Android 设备已经设置了 Google 帐户,因此您可以使用它,但这需要额外的权限和用户同意(确认对话框)。
一些混淆器比其他混淆器要好得多,但它可以保护代码不被逆向工程,而不是数据不被看到,它可以保护你免受没有动机的黑客的攻击,但仅此而已。
如果您试图保护数据免受成功反编译/重新编译您的代码的人的影响,那么除非用户使用未存储在设备上并用于加密/解密的密码授权数据,否则数据永远不应该是明文的即时数据。
我认为最简单的方法是使用密码保护的 HTTPS 会话进行数据传输,然后使用相同的永不存储密码即时加密/解密它,或者使用相同的永不存储密码将其加密存储在 SQL中。
这可能会变得非常复杂,具体取决于您真正想要做的事情、它真正需要的安全性以及您在服务器端拥有多少控制权等等。网络上有很多更详细的东西,这是一本有趣的读物例如
如果你确实想定制,那么 Android 几乎有安全的密钥交换协议、私钥/公钥支持,以及很多通用的加密支持,所以这一切都是可行的,但我不确定我会尝试自己动手,除非你很漂亮对所有协议和正确使用感到满意。
人们通常不需要他们认为的那样多的安全性,但是如果您愿意投入基础设施并花时间对其进行审查,那么您可以获得非常安全的保障。