如何在Android APP中隐藏API URL和参数?

时间:2017-10-18 18:24:09

标签: android reverse-engineering obfuscation

我很想知道如果没有用于混淆的商业产品,有什么方法可以安全地存储API网址和参数,这些都无法在逆向工程中编译?我已经尝试了所有我的应用程序和他们的API网址和代码很容易阅读。我担心安全问题。

3 个答案:

答案 0 :(得分:10)

在环境变量,BuildConfig和Android Studio中隐藏URL

  

避免这种不良做法的一种简单方法是存储您的值   在环境变量中,所以只有你的机器才知道它   以某种方式读取这些值,并在构建时将它们注入到代码中   时间。让我们看看如何使用Android Studio,Gradle和   BuildConfig。

     

首先,我们需要创建这些环境变量。在Linux和Mac中,   创建或编辑文件〜/ .gradle / gradle.properties(注意   实际的Gradle用户主目录位置)并添加一些值:

WEBServiceBaseURL="http://192.168.2.102:2323/"
WEBServiceBaseSMSURL="https://www.example.com/"

enter image description here

  

其次,在模块的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
}

enter image description here

在Java文件中使用

BuildConfig.Base_URL 它将返回URL字符串

  public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit =new Retrofit.Builder()
                    .baseUrl(BuildConfig.Base_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

答案 1 :(得分:0)

您的问题对于StackOverflow并不理想,因为主题过于宽泛且主要基于意见。但是,我想我可以在这里分享一些我的想法。

使用代码混淆隐藏API网址绝对是一个好主意,如果你想隐藏它们,它在某些情况下也可能有效。您也可以考虑在代码中加密API网址,并将加密的网址存储在SharedPreferences或本地存储中,每当您使用API​​网址调用网络时,需要再次对其进行解密服务。

但这些都无法确保您的API网址无法破解。如果有人真的想要获取您的API网址,他/她可以通过跟踪您用来调用网络服务的网络轻松获取这些网址。

因此,加密API网址并模糊变量名称以隐藏API网址在大多数情况下都无法正常工作。是的,我也没有看到任何安全漏洞来获取您的API网址。因为,API服务器的设计应该能够阻止攻击者通过API进行的不必要的服务调用。您可能会考虑在主机中设置防火墙,或者可以设置一个基本的身份验证协议来保护您的数据。有很多方法可以防止这些安全漏洞攻击活动。您也可以考虑阅读this article,我发现这对于如何保护您的API被滥用非常有用。

希望有所帮助。

答案 2 :(得分:0)

我找到了一种隐藏基本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());
}

在MyConstants.java类内部:(我保存了所有api网址的地方。)

// 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/";
    return mUrl;
}

现在,您可以按以下方式获取原始网址:

public static final String API_BASE = "" + getSecureBaseUrl();