首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何隐藏Android APP中的API URL和参数?

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

Stack Overflow用户
提问于 2017-10-19 02:24:09
回答 3查看 10.6K关注 0票数 10

我很好奇,如果没有用于模糊处理的商业产品,有什么方法可以安全地存储API url和参数,而不能在逆向工程中编译它们?我已经尝试了我所有的应用程序,它们的API、url和代码都很容易阅读。我很担心安全问题。

EN

回答 3

Stack Overflow用户

发布于 2017-12-22 21:04:01

在环境变量、BuildConfig和Android Studio中隐藏网址

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

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

代码语言:javascript
运行
复制
WEBServiceBaseURL="http://192.168.2.102:2323/"
WEBServiceBaseSMSURL="https://www.example.com/"

其次,在模块的build.gradle文件中,添加以下行

代码语言:javascript
运行
复制
//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
}

在Java文件中使用,如

BuildConfig.Base_URL它将返回URL字符串

代码语言:javascript
运行
复制
  public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit =new Retrofit.Builder()
                    .baseUrl(BuildConfig.Base_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
票数 12
EN

Stack Overflow用户

发布于 2019-02-26 19:15:28

我找到了一个解决方案来隐藏基本url,以保持NDK的api安全。将base64编码的字符串保存在cpp文件中,并从java类中调用该字符串并解码base64。

将c++ (NDK)支持包含到项目中。您可以将其包含到新项目或旧项目中。

您的cpp文件名可以是(native-lib.cpp)

搜索在线base64编码器和编码您的基本网址。现在将编码的字符串保留在cpp文件中

cpp文件内部示例代码如下所示:

代码语言:javascript
运行
复制
#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。)

代码语言:javascript
运行
复制
// 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;
}

现在你可以获得你的原始url,如下所示:

代码语言:javascript
运行
复制
public static final String API_BASE = "" + getSecureBaseUrl();
票数 4
EN

Stack Overflow用户

发布于 2017-10-19 02:36:03

你的问题对于StackOverflow来说并不理想,因为主题太广泛了,而且主要是基于观点。然而,我想我可以在这里分享一些我的想法作为答案。

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

但是这些都不能保证你的API是不可破解的。如果有人真的想要获得你的API,他/她可以通过跟踪你用来调用web服务的网络来很容易地获得这些地址。

因此,加密API和混淆变量名以隐藏API在大多数情况下都不会像您预期的那样工作。是的,我也不认为获取你的API有任何安全漏洞。因为,API服务器的设计应该能够阻止攻击者通过API进行的不需要的服务调用。您可以考虑在主机中设置防火墙,或者可以设置一个基本的身份验证协议来保护您的数据。有很多方法可以防止这些违反安全的行为。您还可以考虑阅读this article,我发现它对了解如何保护您的API不被滥用很有帮助。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46816825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档