Android安全请求接口

本文介绍了Android应用中如何验证包签名确保安全,并通过加盐MD5加密保护数据,防止非法篡改。首先,通过JNI调用C++层校验包签名,确保只有合法包能执行代码。接着,详细阐述了加密过程,将JSON数据加盐并使用MD5加密,以保证数据在传输过程中不被轻易破解。最后,提到了动态库加壳技术以提高逆向工程的难度。
摘要由CSDN通过智能技术生成

1.先校验包是否是你的包,也就是签名是否是你的,如果不是verify 就是一直为0 ,verify不为1的时候调用这个so库是不执行的。

//获取包名
jclass j_clz_context = env->GetObjectClass(context);
jmethodID j_mid_packege = env->GetMethodID(j_clz_context,"getPackageName","()Ljava/lang/String;");
jstring j_packege_name = (jstring)env->CallObjectMethod(context,j_mid_packege);
const char * c_packege_name = env->GetStringUTFChars(j_packege_name,NULL);
LOGD("%s",c_packege_name);
//对比包名是否一样
if(strcmp(c_packege_name,ndk_packege_name) != 0){
    LOGD("%s","packegename isn't ture");
    return;
}
//获取签名
//1.获取PackageManager
jmethodID j_mid_PackageManager = env->GetMethodID(j_clz_context,"getPackageManager","()Landroid/content/pm/PackageManager;");
jobject j_PackageManager = env->CallObjectMethod(context,j_mid_PackageManager);
//2.获取PackageInfo
jclass j_cla_PackageManager = env->GetObjectClass(j_PackageManager);
jmethodID j_mid_PackageInfo = env->GetMethodID(j_cla_PackageManager,"getPackageInfo","(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jobject j_PackageInfo = env->CallObjectMethod(j_PackageManager,j_mid_PackageInfo,j_packege_name,0x00000040);
//3.获取数组
jclass j_clz_PackageInfo = env->GetObjectClass(j_PackageInfo);
jfieldID j_fid_signature = env->GetFieldID(j_clz_PackageInfo,"signatures","[Landroid/content/pm/Signature;");
jobjectArray j_signatures = (jobjectArray) env->GetObjectField(j_PackageInfo,j_fid_signature);
//4.取数组第0个值
jobject signature_first = env->GetObjectArrayElement(j_signatures,0);
jclass j_clz_signature_first = env->GetObjectClass(signature_first);
jmethodID j_mid_ = env->GetMethodID(j_clz_signature_first,"toCharsString","()Ljava/lang/String;");
jstring j_signature = (jstring) env->CallObjectMethod(signature_first,j_mid_);

const char * c_signature = env->GetStringUTFChars(j_signature,NULL);
//LOGD("sign:%s,wjj",c_signature);

//比对签名是否一样
int i = strcmp(c_signature,ndk_signature);
if( i != 0){
    LOGD("sign:%s,%d","比对失败",i);
    return;
}
LOGD("sign:%s","比对成功");

env->DeleteLocalRef(j_clz_context);
env->DeleteLocalRef(j_PackageManager);
env->DeleteLocalRef(j_cla_PackageManager);
env->DeleteLocalRef(j_PackageInfo);

env->DeleteLocalRef(j_signatures);
env->DeleteLocalRef(signature_first);
env->DeleteLocalRef(j_clz_signature_first);
env->DeleteLocalRef(j_signature);

env->ReleaseStringUTFChars(j_signature,0);
env->ReleaseStringUTFChars(j_packege_name,0);

verify = 1;

2.加密函数,把你要传入的json 传入到c++层,并加盐值(与服务器规定好盐值,如当前时间,包名等等)后MD5返回给java层

3.java层就能把明文的数据和c层加密后的MD5一同发给服务器校验,如果一致,认同是本app发送的数据,可以通信。

4.把编译好的so动态库进行加壳处理,增加逆向成本

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值