使用NDK保护API密钥

时间:2018-04-02 11:18:47

标签: android security android-ndk

我正在尝试使用NDK存储api密钥,但我尝试了somany方法总是somany错误 我会分享我的代码,请任何人帮助我..

我将分享我跟随的步骤..

1在src / main

下创建一个文件夹“jni”

2在“jni”文件夹下创建并添加“Android.mk”文件,内容如下:

     LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE    := keys
    LOCAL_SRC_FILES := keys.c

    include $(BUILD_SHARED_LIBRARY)
  1. 使用以下内容在“jni”文件夹下创建并添加“Application.mk”文件:

    APP_ABI := all
    
  2. 创建C / C ++文件“keys.c”并将其添加到“jni”文件夹下。添加以下内容:

     # include < jni.h >
    
    JNIEXPORT jstring JNICALL
    Java_com_mytest_aes_MainActivity_getNativeKey1(JNIEnv *env, jobject instance) {
    
        return (*env)->NewStringUTF(env, "haii");
    }
    
  3. 在您要访问密钥的活动中(在我们的示例中为MainActivity),创建一个静态块并加载库“keys”,如:

     static
     {
         System.loadLibrary("keys");
     }
    
  4. 声明类型native的两个成员函数以访问C / C ++文件中的键。由于我们存储了2个键,因此我们将声明2个函数:

         public native String getNativeKey1();
    
  5. 对于演示,请访问代码中的键,如:

        String key1 = new String(Base64.decode(getNativeKey1(),Base64.DEFAULT));
    
    
        ((TextView)findViewById(R.id.key)).setText("Key1-->"+key1);
    
  6. 现在,我们的C / C ++本机文件和Java代码已准备就绪。但是要使用NDK编译或生成本机构建,我们需要在gradle文件中添加条目:

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

    我们需要为“Android.mk”文件提供路径。

  7. 现在,同步并构建项目。确保您已在模块设置中正确指出NDK路径。

1 个答案:

答案 0 :(得分:0)

可以通过多种方法来确保API密钥的安全。

Best practice for storing and protecting private API keys in applications

使用Android NDK保护API密钥

https://medium.com/@abhi007tyagi/storing-api-keys-using-android-ndk-6abb0adcadad

不要忘记在模块设置中正确定义NDK路径。 (文件->项目结构-> SDK位置选项卡-> Android NDK位置)

请注意,使用NDK并不是完整的证明,您仍然可以提取密钥。但是,这将为您的密钥增加一层额外的混淆。

建议的解决方案:-可以根据应用程序中数据的敏感性,结合使用多种方法,例如混淆,加密,使用NDK,在服务器中存储密钥,https集成等。