是否有更安全的方法在Android项目中存储敏感字符串?

时间:2015-10-13 08:25:15

标签: android security decompiling

在我的Android项目中,我想保持我的网络服务地址未知。 我存储链接如下:

private final String SERVICE_LINK = "mywebservicelink..."

但是既然我看到APK可以被反编译,我想知道这个链接是否可以被人知道。

如何安全存放?

感谢。

3 个答案:

答案 0 :(得分:3)

您可以在gradle.properties

中设置敏感字符串

https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_properties_and_system_properties

例如:

在您的gradle.properties(通常位于您的根项目中)中,您可以定义:

SERVICE_LINK = "mywebservicelink"

然后在您的应用程序中build.gradle

android {
   ...
   defaultConfig {
       resValue "string", "service_link", SERVICE_LINK
   }
   ...
}

然后,此服务链接将在您的资源中准备好R.string.service_link。也就是说,您可以通过执行以下操作来获取值:

getString(R.string.service_link);

编辑1:

如果您询问如何在APK中隐藏字符串,则可以使用ProGuard。 但是,请注意。无论您在源代码中添加什么内容,都不能100%保证它不能进行逆向工程。 ProGuard将对您的代码进行模糊处理,这将使逆向工程变得更加困难。

有关更多信息,此主题非常棒: How to avoid reverse engineering of an APK file?

答案 1 :(得分:1)

您可以在执行某些操作后指定SERVICE_LINK变量的值,而不是直接指定。例如,使用带有一些无意义字符串的字符串操作,从某些特定位置获取字符或子字符串,从某些算术运算等获得的ASCII代码中获取某些字符可能对此有用。

这提供了复杂性,因此第三方人员不容易找到您的常数值。他们可能认为这是一个随运行时间变化的动态值,或者是不相关的东西。但如果直接在“”中,就会很容易找到它。

答案 2 :(得分:0)

根据经验,不能隐藏任何网络地址。

任何正在搜索网络服务,地址或相关内容的人都可以监控他们自己的网络并捕获这些包。

主机的域名或IP始终处于明显的状态。