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

Is there a more secure way to store sensitive string in an Android project?

在我的 Android 项目中,我想保持我的 Web 服务地址未知。 我将 link 存储如下:

private final String SERVICE_LINK = "mywebservicelink..."

不过看到apk可以反编译,不知这个link可否知道。

如何安全地存储它?

谢谢。

您可以在 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
   }
   ...
}

然后,此服务 link 将作为 R.string.service_link 在您的资源中准备就绪。也就是说,您可以通过以下方式简单地获取值:

getString(R.string.service_link);

编辑 1:

如果您询问如何在 APK 中隐藏字符串,那么您可以使用 ProGuard。 但是,请注意。无论您在源代码中放入什么,都不能 100% 保证它不会被逆向工程。 ProGuard 会混淆您的代码,这将使逆向工程变得更加困难。

有关更多信息,这个帖子很棒: How to avoid reverse engineering of an APK file?

你可以在SERVICE_LINK变量做一些操作后赋值,而不是直接赋值。例如对一些无意义的字符串进行字符串操作,从某些特定位置获取字符或子字符串,从一些算术运算得到的ASCII码中获取一些字符等可能对此有所帮助。

这增加了复杂性,使第三方人员无法轻易找到您的恒定值。他们可能认为这是一个随 运行 时间变化的动态值,或者一些不相关的东西。但是如果直接在" "里,就很容易找到了。

根据经验,无法隐藏任何网络地址。

任何正在搜索网络服务、地址或相关内容的人都可以监控自己的网络并捕获数据包。

主机的域或 IP 将始终清晰可见。