前言
为了防止接口被滥用 通常需要对请求添加特别的参数。这样在请求时遇到不对的可以直接忽略,防止数据抓取。
对应加密算法的选择,通常有AES MD5等。其中的细节和不同单独开一篇密码学知识。
本次加密采取MD5加密
java层
新建native方法即可,传入需要加密的字符串
public native String encryptMD5(String str);
load so
static { System.loadLibrary("native-lib-1"); }
jni层
添加算法函数 md5.h md5.cpp
这两个文件我已经分享了 就不用自己写,反正就是通用的算法没必要自己拉一份出来。
核心文件 navite.cpp
引入头文件即可
#include <jni.h>
#include <string>
#include "md5.h"
实现 encryptMD5 方法 这里使用静态注册
extern "C" JNIEXPORT jstring JNICALL
Java_com_huruwo_ndk_1learn_MainActivity_encryptMD5(
JNIEnv* env,
jobject /* this */,jstring str) {
MD5_CTX md5;
MD5Init(&md5);
auto encrypt = env->GetStringUTFChars(str, JNI_FALSE);
unsigned char decrypt[16];
MD5Update(&md5, (unsigned char *) encrypt, strlen((char *) encrypt));
MD5Final(&md5, decrypt);
//定义需要返回的char*
char *md5str;
//将加密后的unsigned char数组转化为char* 返回
md5str = transformChar(&decrypt[0]);
free(md5str);
return env->NewStringUTF(md5str);
}
简单的讲解这个调用过程
1.md5初始化
MD5_CTX md5;
MD5Init(&md5);
2.str传入字符串转换成char
auto encrypt = env->GetStringUTFChars(str, JNI_FALSE);
3.加密计算 结果放到char decrypt 里面
unsigned char decrypt[16];
MD5Update(&md5, (unsigned char *) encrypt, strlen((char *) encrypt));
MD5Final(&md5, decrypt);
4.一个将加密char转换为string的函数
char * transformChar(unsigned char *arg) {
char enstr[33];
char *dest_str;
for (int i = 0; i < 16; ++i) {
int c1 = arg[i] / 16;
setChar(&c1);
int c2 = arg[i] % 16;
setChar(&c2);
char c3 = c1;
char c4 = c2;
enstr[i * 2] = c3;
enstr[i * 2 + 1] = c4;
}
enstr[32] = '\0';
dest_str = (char *) calloc(sizeof(enstr), sizeof(char));
// dest_str = (char *)malloc(sizeof(char) * (sizeof(enstr)));
/* 为字符串分配堆空间 */
strncpy(dest_str, enstr, sizeof(enstr));
// 用C标准库函数strncpy拷贝字符
return dest_str;
}
5.return结果
//将加密后的unsigned char数组转化为char* 返回
md5str = transformChar(&decrypt[0]);
free(md5str);
return env->NewStringUTF(md5str);
cmake文件
add_library( # Sets the name of the library.
native-lib-3
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
md5.cpp
native-lib-3.cpp)
核心就是加入 md5.cpp 文件 注意文件的路径
这里是同一个目录 所以直接填文件名即可
总结来说 这次没有设置 加盐 的操作只是为了看起来简单而已。
各位可以自行操作 加盐 计算。
总结
整体的难度很小 为了加密强度 各位还是要加上盐,毕竟标准算法还是很容易被监测出来。
也可以获取一些系统的变量来作为参数传递,加深强度。