JNIKeyProtection 私密数据存储开源项目

我要开发同款
匿名用户2018年11月22日
47阅读
开发技术Java
所属分类程序开发、安全相关框架
授权协议未知

作品详情

Android使用so文件存储私密数据,并增加签名防盗机制。

0x00实际项目中引出的一些需求问题

有时你需要在客户端存放一些保密的数据,比如某些授权Key,如果直接写在Java中,会很容易被反编译看到,那么我们可以把这些数据存在so文件中,来增加反编译难度,并且增加APP签名防盗机制来防止别人盗用so文件。

0x01一些准备工作

配置NDK开发环境,看这里→AndroidStudioNDK开发安装配置

有必要的了解一下NDK开发基础(此例子使用的是CMake)、最好学习一下C/C++基础,不然代码看起来很费劲

0x02编写配置文件、Java、C/C++代码

1、新建JNIKey.class并声明native方法

public class JNIKey {    static {        System.loadLibrary("Key");    }    /**     * 初始化并判断当前 APP 是否为合法应用,只需调用一次     *     * @return 返回 true 则初始化成功并当前 APP 为合法应用     */    public static native boolean init();    /**     * 获取 Key     *     * @return return key     */    public static native String getKey();}

2、Build→RebuildProject生成class文件,生成目录一般在如下目录

JNIKey\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes\me\key\protection\

3、根据生成的class文件生成.h文件,进入Terminal命令窗口输入以下命令

javah -d jni -classpath D:\Android\Workspace\JNIKeyProtection\Key\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes me.key.protection.JNIKey

注意路径不要写错了,生成的.h文件里包含自动生成的一些方法,方法名称一一应对Javanative方法,如果在.cpp代码里用的是动态注册的方式,这步可以忽略不做,因为动态注册方法名可以随便写,具体看.cpp里的代码

4、在src\main目录下新建cpp目录,新建Key.cpp文件在这里编写C++代码,.cpp表示C++文件,.c表示C文件

5、在Module根目录下新建CmakeLists.txt文件,配置JNI相关参数

# 指定编译器版本cmake_minimum_required(VERSION 3.4.1)# 存放生成 so 库的目录# set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})# 配置 so 库信息add_library(        # 生成的 so 库名称,此处生成的 so 文件名称是libKey.so        Key        # STATIC:静态库,是目标文件的归档文件,在链接其它目标的时候使用        # SHARED:动态库,会被动态链接,在运行时被加载        # MODULE:模块库,是不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数动态链接        SHARED        # 资源文件,可以多个,资源路径是相对路径,相对于本CMakeLists.txt所在目录        src/main/cpp/Key.cpp)# 依赖 NDK 中的 log 日志库find_library(        log-lib        log)# 关联 log 库到本地库。如果你本地的库(DecryptKey)想要调用log库的方法,那么就需要配置这个属性target_link_libraries(        # 目标库        Key        # 依赖库        ${log-lib})

注意是Module根目录,不是Project根目录

6、修改对应Module的build.gradle文件添加配置参数

defaultConfig标签里添加如下配置

externalNativeBuild {        cmake {            cppFlags "-frtti -fexceptions"        }    }    // 平台架构支持    ndk {        abiFilters 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'x86', 'x86_64'    }

android标签里添加如下配置

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

7、在cpp文件夹下新建Key.cpp文件里面放c++代码

完整代码→Key.cpp

0x03调用生成的.so文件

默认.so文件生成目录,复制出来放到libs目录下,即可使用

{项目目录}\JNIKey\build\intermediates\cmake\debug\obj\

你可以对生成的库文件封装一个Jar包,这样.so就不必放在特定的包下,Jar包的生成必须要Module里,默认Jar包生成目录

{项目目录}\JNIKey\build\intermediates\intermediate-jars\debug\classes.jar
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论