前言
网络传输过程中对数据进行加解密是非常必要的操作,Java 就可以实现数据加解密操作,但是使用 NDK 来做能提高安全性(密钥放在 so 文件中)和性能.
加密方式
在这个 Demo 中,我们使用 AES(对称加密)来处理数据. 对称加密的加解密双方持有完全相同的密钥,也就是说客户端和服务器约定一套"密码",大家传输数据都用此密钥加密,加密后的数据是不可读的,另一方拿到数据后马上用密钥解密数据. 这就好比二战时代的军情电报,大家都用同一套密码本,使用密码本将前线军情转换成别人读不懂的代号,接收方因为有同样的密码本,可以将这些代号逐一翻译成可读的信息.
我们的应用程序中的支付数据,关键接口数据基本会使用加密传输,避免网络请求被拦截后用户信息暴露给其他人.
实现过程
我们使用 AES/CBC/NoPadding 进行数据加解密,加解密操作由 Java 层处理,而密钥被保存在 JNI 层.
- 首先编写 JNI 层代码,操作很简单,只是 JNI 从 Native 层获取一个字符串到 Java 层
#include "com_bailun_kai_encryptdemo_JniEncrypt.h"
JNIEXPORT jstring JNICALL Java_com_bailun_kai_encryptdemo_JniEncrypt_getAESPassWord
(JNIEnv *env, jobject){
//当前 AES 的密钥长度为 16 字节,128 bit
return env->NewStringUTF("BlTEstHeLLoWORld");
}
- 加载 so 库
public class JniEncrypt {
public native String getAESPassWord();
static {
System.loadLibrary("EncryptLib");
}
}
- 加解密过程