java jni key_JNIKeyProtection

软件简介

JNIKeyProtection

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

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

有时你需要在客户端存放一些保密的数据,比如某些授权 Key ,如果直接写在 Java 中,会很容易被反编译看到,那么我们可以把这些数据存在 so

文件中,来增加反编译难度,并且增加 APP 签名防盗机制来防止别人盗用 so 文件。

0x01 一些准备工作

有必要的了解一下 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 → Rebuild Project 生成 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 文件里包含自动生成的一些方法,方法名称一一应对 Java native 方法,如果在 .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++ 代码

0x03 调用生成的 .so 文件

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

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

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

{项目目录}\JNIKey\build\intermediates\intermediate-jars\debug\classes.jar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值