使用Android NDK(原生开发工具包)保护API密钥安全

作者:API传播员 · 2026-01-10 · 阅读时间:6分钟

如果你是一名Android开发人员,或者正在学习成为一名优秀的Android开发者,那么你可能已经意识到保护API密钥在应用开发中的重要性。我们在开发Android应用时,经常会使用第三方库或服务(如Google地图或Google Play服务),这些服务通常需要API密钥来访问。然而,如果API密钥没有妥善保护,很容易通过逆向工程被他人获取,从而带来高昂的费用或其他安全问题。

在本文中,我们将介绍如何使用Android Native Development Kit(NDK)为API密钥增加一层保护。虽然NDK方法不能完全杜绝API密钥被破解的可能,但它能够显著提高破解的难度,为应用安全提供额外保障。以下是本文的主要内容:


当前问题

在Android开发中,API密钥通常存储在strings.xmlgradle.properties文件中。例如:


    SecureAPI
    YOUR_AWESOME_API_KEY_HERE

或者在gradle.properties中:

MyAwesomeKey="YOUR_AWESOME_API_KEY_HERE"

随后在build.gradle中引用:

buildTypes {
    debug {
        buildConfigField 'String', "ApiKey", MyAwesomeKey
        resValue 'String', "api_key", MyAwesomeKey
    }
}

然而,这些方法的共同问题在于,API密钥可以通过逆向工程轻松被提取。因此,我们需要一种更安全的方式来保护API密钥。


建议解决方案

为了解决上述问题,我们可以利用Android NDK,将API密钥存储在C或C++编写的本地代码中,并编译为二进制文件(.so文件)。这些文件以二进制形式存储数据,即使被逆向工程,也很难直接读取其中的内容。

虽然完全防止API密钥泄露几乎不可能,但通过这种方式可以显著提高破解难度,为应用安全提供额外保护。


如何在Android中做到这一点?(三种方式)

在Android中,我们可以通过以下三种方式使用NDK保护API密钥:

  1. 使用本机C++模板
  2. 使用CMake
  3. 使用ndk构建

在继续之前,请确保已满足以下先决条件。

先决条件

  1. 在Android Studio中,进入 工具 > SDK管理器 > SDK工具,下载并安装以下工具:
    • LLDB:用于调试本地代码。
    • NDK:用于编写C/C++代码。
    • CMake:用于构建和管理本地代码。

安装完成后,即可开始保护API密钥的具体操作。


方法一:使用本机C++模板

此方法适用于支持本机C++模板的Android Studio版本。

步骤1:创建新项目

在Android Studio中,选择Native C++模板创建一个新项目。

步骤2:添加API密钥

在生成的native-lib.cpp文件中,添加以下代码:

#include 
#include 

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_myapplication_APIKeyLibrary_getAPIKey(JNIEnv *env, jobject /* this */) {
    std::string api_key = "YOUR_AWESOME_API_KEY_HERE";
    return env->NewStringUTF(api_key.c_str());
}

步骤3:加载本地库

在Kotlin代码中,通过System.loadLibrary加载本地库:

init {
    System.loadLibrary("native-lib")
}

步骤4:调用API密钥

声明一个外部函数并调用它:

external fun getAPIKey(): String

val apiKey = APIKeyLibrary.getAPIKey()

方法二:使用CMake

如果你的Android Studio版本不支持本机C++模板,可以手动使用CMake添加文件。

步骤1:创建本地文件

cpp目录下创建一个名为api-keys.cpp的文件,并添加以下代码:

#include 
#include 

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_myapplication_APIKeyLibrary_getAPIKey(JNIEnv *env, jobject /* this */) {
    std::string api_key = "YOUR_AWESOME_API_KEY_HERE";
    return env->NewStringUTF(api_key.c_str());
}

步骤2:配置CMake

在项目根目录下创建CMakeLists.txt文件,添加以下内容:

cmake_minimum_required(VERSION 3.4.1)

add_library(
    api-keys
    SHARED
    src/main/cpp/api-keys.cpp
)find_library(
    log-lib
    log
)target_link_libraries(
    api-keys
    ${log-lib}
)

步骤3:在build.gradle中配置

build.gradle文件中,指定CMake路径:

android {
    ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

方法三:使用ndk构建

如果你的项目需要使用ndk-build,可以通过以下步骤实现。

步骤1:创建Android.mk文件

jni目录下创建Android.mk文件,添加以下内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := api-keys
LOCAL_SRC_FILES := api-keys.cppinclude $(BUILD_SHARED_LIBRARY)

步骤2:创建Application.mk文件

jni目录下创建Application.mk文件,指定构建设置:

APP_ABI := all

步骤3:在build.gradle中配置

build.gradle文件中,指定Android.mk路径:

android {
    ...
    externalNativeBuild {
        ndkBuild {
            path "src/main/jni/Android.mk"
        }
    }
}

总结

通过本文,我们学习了如何使用Android NDK保护API密钥的三种方法:本机C++模板、CMake和ndk构建。虽然这些方法不能完全杜绝API密钥被破解的可能,但它们为应用安全提供了重要的额外保护。

希望本文对你有所帮助!如果你觉得有用,请分享给其他开发者,共同提升应用安全性

快乐学习!

原文链接: https://blog.mindorks.com/securing-api-keys-using-android-ndk