前言
網(wǎng)絡(luò)傳輸過程中對數(shù)據(jù)進(jìn)行加解密是非常必要的操作,Java 就可以實(shí)現(xiàn)數(shù)據(jù)加解密操作,但是使用 NDK 來做能提高安全性(密鑰放在 so 文件中)和性能.
加密方式
在這個(gè) Demo 中,我們使用 AES(對稱加密)來處理數(shù)據(jù). 對稱加密的加解密雙方持有完全相同的密鑰,也就是說客戶端和服務(wù)器約定一套"密碼",大家傳輸數(shù)據(jù)都用此密鑰加密,加密后的數(shù)據(jù)是不可讀的,另一方拿到數(shù)據(jù)后馬上用密鑰解密數(shù)據(jù). 這就好比二戰(zhàn)時(shí)代的軍情電報(bào),大家都用同一套密碼本,使用密碼本將前線軍情轉(zhuǎn)換成別人讀不懂的代號,接收方因?yàn)橛型瑯拥拿艽a本,可以將這些代號逐一翻譯成可讀的信息.
我們的應(yīng)用程序中的支付數(shù)據(jù),關(guān)鍵接口數(shù)據(jù)基本會使用加密傳輸,避免網(wǎng)絡(luò)請求被攔截后用戶信息暴露給其他人.
實(shí)現(xiàn)過程
我們使用 AES/CBC/NoPadding 進(jìn)行數(shù)據(jù)加解密,加解密操作由 Java 層處理,而密鑰被保存在 JNI 層.
- 首先編寫 JNI 層代碼,操作很簡單,只是 JNI 從 Native 層獲取一個(gè)字符串到 Java 層
#include "com_bailun_kai_encryptdemo_JniEncrypt.h"
JNIEXPORT jstring JNICALL Java_com_bailun_kai_encryptdemo_JniEncrypt_getAESPassWord
(JNIEnv *env, jobject){
//當(dāng)前 AES 的密鑰長度為 16 字節(jié),128 bit
return env->NewStringUTF("BlTEstHeLLoWORld");
}
- 加載 so 庫
public class JniEncrypt {
public native String getAESPassWord();
static {
System.loadLibrary("EncryptLib");
}
}
- 加解密過程