Chi*_*shi 2 obfuscation android reverse-engineering
我很想知道如果没有用于混淆的商业产品,有什么方法可以安全地存储API网址和参数,这些都无法在逆向工程中编译?我已经尝试了所有我的应用程序和他们的API网址和代码很容易阅读.我担心安全问题.
Mal*_*una 11
避免这种不良做法的一种简单方法是将值存储在环境变量中,因此只有您的机器知道它,然后以某种方式读取这些值并在构建时将它们注入代码中.让我们看看如何使用Android Studio,Gradle和BuildConfig来做到这一点.
首先,我们需要创建这些环境变量.在Linux和Mac中,创建或编辑文件〜/ .gradle/gradle.properties(注意实际的Gradle User Home目录位置)并添加一些值:
WEBServiceBaseURL="http://192.168.2.102:2323/"
WEBServiceBaseSMSURL="https://www.example.com/"
Run Code Online (Sandbox Code Playgroud)
其次,在模块的build.gradle文件中,添加这些行
//Add these lines
def Base_URL = '"' + WEBServiceBaseURL + '"' ?: '"Define BASE URL"';
def SMS_Base_URL = '"' + WEBServiceBaseSMSURL + '"' ?: '"Define SMS BASE URL"';
android.buildTypes.each { type ->
type.buildConfigField 'String', 'Base_URL', WEBServiceBaseURL
type.buildConfigField 'String', 'SMS_Base_URL', WEBServiceBaseSMSURL
}
Run Code Online (Sandbox Code Playgroud)
在Java文件中使用
BuildConfig.Base_URL它将返回URL String
public static Retrofit getClient() {
if (retrofit==null) {
retrofit =new Retrofit.Builder()
.baseUrl(BuildConfig.Base_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
Run Code Online (Sandbox Code Playgroud)
我找到了一个隐藏基本 url 的解决方案,以确保 NDK 保护 api 的安全。将base64编码的字符串保留在cpp文件中,并从java类调用它并解码base64。
在您的项目中包含 c++ (NDK) 支持。您可以将其包含到您的新项目或旧项目中。
您的 cpp 文件名可以类似于 (native-lib.cpp)
搜索在线 base64 编码器并编码您的基本 url。现在将编码的字符串保留在 cpp 文件中
cpp 文件内部示例代码如下:
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_touhidapps_MyProject_utils_MyConstants_baseUrlFromJNI(JNIEnv *env, jobject) {
std::string mUrl = "aHR0cDovL2FwaS5leGFtcGxlLmNvbS8="; //"http://api.example.com/";
return env->NewStringUTF(mUrl.c_str());
}
Run Code Online (Sandbox Code Playgroud)
在 MyConstants.java 类中:(我保存了所有 api url。)
// load c++ library
static {
System.loadLibrary("native-lib");
}
public static native String baseUrlFromJNI();
// decode base64 to a string and get normal url
public static String getSecureBaseUrl() {
String mUrl = baseUrlFromJNI();
try {
String text = new String(Base64.decode(mUrl, Base64.DEFAULT), "UTF-8");
return text;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
mUrl = "http://demo.example.com/"; // don't change this link. This will not execute normally, if exception happens then it will return a demo url.
return mUrl;
}
Run Code Online (Sandbox Code Playgroud)
现在你可以得到你的原始网址,如下所示:
public static final String API_BASE = "" + getSecureBaseUrl();
Run Code Online (Sandbox Code Playgroud)
您的问题对于 StackOverflow 来说并不理想,因为该主题太宽泛并且主要基于意见。不过,我想我可以在这里分享一些我的想法作为答案。
通过代码混淆来隐藏 API url 绝对是一个好主意,如果您想隐藏它们,它在某些情况下也可能有效。您也可以考虑对代码中的 API URL 进行加密,并将加密的 URL 存储在您的SharedPreferences或本地存储中,每次使用 API URL 调用 Web 服务时都需要再次解密。
但这些都不能确保你的 API url 是不可破解的。如果有人确实想获取您的 API URL,他/她可以通过跟踪您用来调用 Web 服务的网络轻松获取这些 URL。
因此,在大多数情况下,加密 API url 并混淆变量名称以隐藏 API url 将不会像您预期的那样起作用。是的,我在获取 API url 方面也没有发现任何安全漏洞。因为,API 服务器的设计方式应该能够阻止攻击者通过 API 进行不需要的服务调用。您可能会考虑考虑在主机中设置防火墙,或者可以设置基本身份验证协议来保护您的数据。有很多方法可以防止这些安全漏洞活动。您也可以考虑阅读这篇文章,我发现这篇文章对于了解如何保护 API 不被滥用很有用。
希望有帮助。