NDK安全开发笔记--请求参数加密

前言

为了防止接口被滥用 通常需要对请求添加特别的参数。这样在请求时遇到不对的可以直接忽略,防止数据抓取。

对应加密算法的选择,通常有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 文件 注意文件的路径

这里是同一个目录 所以直接填文件名即可

总结来说 这次没有设置 加盐 的操作只是为了看起来简单而已。

各位可以自行操作 加盐 计算。

总结

整体的难度很小 为了加密强度 各位还是要加上盐,毕竟标准算法还是很容易被监测出来。

也可以获取一些系统的变量来作为参数传递,加深强度。

参考资料和文章源代码分享

参考 https://github.com/h8452763/NDKmd5

文章源代码分享 https://github.com/HuRuWo/LearnNDK

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值