Android本地关键代码安全处理
创始人
2025-05-31 08:11:24

一、背景

最近在做代码安全方面的工作,发现一些关键信息如:密钥、加密策略等直接写死在项目代码中,存在代码安全隐患。本文档提供一种示例:把关键信息,保存在native层;并对安装包关联信息进行校验,防止反编译、重签名导致信息泄露的可能。

二、处理方式

  • 关键信息、算法、逻辑下沉;利用C/C++编写,利用JNI方式引用。so库+核心java类,导出aar文件。
  • 导入aar,加载so库过程中对其关联的APP签名进行校验。如果校验通过,才能获取库内部信息。
  • 对C/C++编写的so库进行安全加固,二次防编译。
    在这里插入图片描述

三、关键逻辑

1. 签名校验

1.1 java代码获取签名

 private String getSign1() {try {//通过PackageManager获取PackageManager pm = getPackageManager();PackageInfo pi = pm.getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);Signature[] signatures = pi.signatures;Signature signature0 = signatures[0];return signature0.toCharsString();} catch (Exception e) {e.printStackTrace();return "";}}private String getSign2() {try {// 下面几行代码展示如何任意获取Context对象,在jni中也可以使用这种方式Class activityThreadClz = Class.forName("android.app.ActivityThread");Method currentApplication = activityThreadClz.getMethod("currentApplication");Application application = (Application) currentApplication.invoke(null);PackageManager pm = application.getPackageManager();PackageInfo pi = pm.getPackageInfo(application.getPackageName(), PackageManager.GET_SIGNATURES);Signature[] signatures = pi.signatures;Signature signature0 = signatures[0];return signature0.toCharsString();} catch (Exception e) {e.printStackTrace();return "";}}

1.2 C获取签名

static int verifySign(JNIEnv *env) {// Application objectjobject application = getApplication(env);if (application == NULL) {return JNI_ERR;}// Context(ContextWrapper) classjclass context_clz = env->GetObjectClass(application);// getPackageManager()jmethodID getPackageManager = env->GetMethodID(context_clz, "getPackageManager","()Landroid/content/pm/PackageManager;");// android.content.pm.PackageManager objectjobject package_manager = env->CallObjectMethod(application, getPackageManager);// PackageManager classjclass package_manager_clz = env->GetObjectClass(package_manager);// getPackageInfo()jmethodID getPackageInfo = env->GetMethodID(package_manager_clz, "getPackageInfo","(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");// context.getPackageName()jmethodID getPackageName = env->GetMethodID(context_clz, "getPackageName","()Ljava/lang/String;");// call getPackageName() and cast from jobject to jstringjstring package_name = (jstring) (env->CallObjectMethod(application, getPackageName));// PackageInfo objectjobject package_info = env->CallObjectMethod(package_manager, getPackageInfo, package_name, 64);// class PackageInfojclass package_info_clz = env->GetObjectClass(package_info);// field signaturesjfieldID signatures_field = env->GetFieldID(package_info_clz, "signatures","[Landroid/content/pm/Signature;");jobject signatures = env->GetObjectField(package_info, signatures_field);jobjectArray signatures_array = (jobjectArray) signatures;jobject signature0 = env->GetObjectArrayElement(signatures_array, 0);jclass signature_clz = env->GetObjectClass(signature0);jmethodID toCharsString = env->GetMethodID(signature_clz, "toCharsString","()Ljava/lang/String;");// call toCharsString()jstring signature_str = (jstring) (env->CallObjectMethod(signature0, toCharsString));// releaseenv->DeleteLocalRef(application);env->DeleteLocalRef(context_clz);env->DeleteLocalRef(package_manager);env->DeleteLocalRef(package_manager_clz);env->DeleteLocalRef(package_name);env->DeleteLocalRef(package_info);env->DeleteLocalRef(package_info_clz);env->DeleteLocalRef(signatures);env->DeleteLocalRef(signature0);env->DeleteLocalRef(signature_clz);//获取到安装的APK对应的签名const char *sign = env->GetStringUTFChars(signature_str, NULL);if (sign == NULL) {LOGE("分配内存失败");return JNI_ERR;}//    LOGI("应用中读取到的签名为:%s", sign);int result_debug = strcmp(sign, SIGN_Debug);int result_release = strcmp(sign, SIGN_Release);// 使用之后要释放这段内存env->ReleaseStringUTFChars(signature_str, sign);env->DeleteLocalRef(signature_str);if (result_debug == 0 || result_release == 0) { // 签名一致return JNI_OK;}return JNI_ERR;
}

1.3 是否打开APP签名校验

void Java_com_ankerwork_ctool_Security_setCheckSign(JNIEnv *env, jclass clazz, jboolean is_check) {unsigned char b = is_check;LOGI("/n is_check: %lu  ", b);if (b) {isCheck = true;} else {isCheck = false;}
}

2. 打包AAR

找到Module对应的Task,执行 执行assembleRelease
如:
在这里插入图片描述

3. 调用

3.1 引入AAR

  1. 将aar拷贝至该Module的libs目录中
  2. 在该Module的build.gradle中补上下面的代码
repositories {flatDir {dirs 'libs'}
}
dependencies {compile(name:'XXX', ext:'aar')
}

3.2 Java代码获取签名

参考1.1方法

3.3 c代码中填写签名内容

定义变量如:

static const char *sign = "1111"

3.4 设置是否校验签名

public class Security {static {System.loadLibrary("selfsecurity");}public static native String getIjmSecret();public static native void setCheckSign(boolean isCheck);
}Security.setCheckSign(true);//设置校验签名

3.5 获取关键Key

Security.getIjmSecret()

四、参考代码

完整代码链接:https://download.csdn.net/download/fepengwang/87594007

相关内容

热门资讯

惨不忍睹!5月合资新能源暴跌:... 合资新能源,最近有点烦在国内的新能源汽车市场,合资新源是一个非常有意思的存在。这一类的新能源汽车,最...
3万美元“产品”,说归零就归零... 投资小红书-第240期 过面尘土、伤痕累累,但我们依然且必须相信时如果不是翻开历史,投资者很难想象:...
全球化遭遇空前挑战,中美双核驱... 界面新闻记者 | 刘婷 在6月7日的“中国宏观经济论坛”(CMF)上,与会专家表示,短期内,特朗普...
饶毅拍案而起:科伦老板光膀子卖... 文 | 张佳儒等你到了75岁,肌肉紧实有型,胸肌、臂肌线条清晰,你敢想吗?梦想还是要有的,因为真的有...
金陵体育笑傲苏超 金陵体育笑傲... 富凯摘要:金陵体育表示,正积极探索2C业务增长点,以打造城镇体育为支点孵化体育消费品牌矩阵。作者|辛...
央企控股上市公司密集发声,多措... 今年以来,国务院国资委多次部署提高央企控股上市公司质量,加强市值管理,传递信心、稳定预期。近期多家央...
上交所:将推动上市公司进一步加... 上海6月6日电 (高志苗)上海证券交易所6日发布消息称,上交所近日召开高分红重回报暨上市公司价值提升...
特斯拉“跌下神坛”? 6月5日,马斯克与特朗普反目互怼后不久,特斯拉股价当日一度暴跌16%,截至当天收盘,特斯拉股价较开盘...
汉武帝都点赞的一次复仇 汉武帝... 上文讲到齐景公复霸,复哪个霸呢?春秋五霸之首,齐桓公。不过今天我们不讲著名的齐桓公,而是讲他的哥哥,...
“普五”破价到了756元,五粮... 随着“618”大促的到来,白酒企业的价格体系,再次遭受强烈冲击。去年,各大电商平台以“百亿补贴”为主...
比买黄金还赚钱!“塑料茅台”L... 年轻人的“茅台”竟然是个“娃娃”?泡泡玛特旗下的Labubu,正借着爆火的流量红利,身价一路飙升。据...
聚焦“两高四着力” 人大代表在... 河南日报客户端记者 陈小平 “今年,我们将采取‘建租结合’的方式,在北京、上海、武汉、沈阳、西安、成...
原创 促... 周末,市场没有利空,大家的情绪慢慢平静了,上证指数再次临近3400点,已经是物是人非了。银行分化,白...
江西“首富”李德仙,财富缩水超... 光伏行业分化,已成大趋势。今年一季度如果说哪家光伏巨头的表现最让外界大跌眼镜,那么晶科能源一定“榜上...
福莱新材推“三维力”电子皮肤 ... 21世纪经济报道记者 赵云帆 上海报道从未来终局角度思考,柔性多模态电子皮肤无疑是通用型人形机器人的...
2025年6月7日比特币与以太... 特朗普马斯克公开决裂引发市场巨震,比特币反弹至104,472美元,以太坊大幅反弹至2,474美元 一...
广州首批配售型保障房摇出选房序... 6月7日上午,广州今年首批配售型保障房迎来了第二次摇号确定选房序号的关键环节。在前期经过递交申请、第...
贬低业绩可以忍,贬低颜值不能忍... 6月7日,金石杂谈近期太关注公募了,不曾想对私募圈消息闭塞了。在6月5日深夜,私募小魔女李蓓开通个人...
热搜!“全智贤老公炒币亏了15... 6月7日午后,“全智贤老公炒币亏了150亿韩元”相关话题一度登上微博热搜。据观察者网援引韩媒报道,随...
中信建投:持续看好创新药产业技... 人民财讯6月7日电,中信建投研报表示,美国临床肿瘤学会(ASCO)年会是世界上规模最大、学术水平最高...
特斯拉“擎天柱”人形机器人项目... 来源:中国新闻网中新网6月7日电(吴家驹)综合外媒报道,特斯拉“擎天柱”(Optimus)人形机器人...
周鸿祎:准备干掉360整个市场... 周鸿祎称准备干掉360整个市场部。360集团创始人、董事长兼首席执行官周鸿祎发视频称,“我准备干掉3...
一娃难求的Labubu,捧出河... 如今,河南 “消费三象”胖东来、蜜雪冰城和泡泡玛特,已成为商超、茶饮、潮玩领域 “新标杆”。相较其他...
年轻人氪金“塑料茅台”,Lab... 来源|Tech星球文|张宁洢去年开始,一个名叫Labubu的新系列潮玩在北美悄然走红。这个有着尖耳朵...
千亿A股创新药公司,现重大研发... 本周 (6月2日—6月6日) 机构调研公司数量仍在百家以上,截至6月6日18时,共有141家上市公司...
比亚迪、小米超特斯拉成国人买车... 在中国汽车市场上,特斯拉一直都是非常特殊的存在,作为新能源汽车的龙头,特斯拉的号召力可谓是无与伦比,...
截至4月底首次突破33万亿元—... 公募基金总规模仍在持续上涨。截至今年4月底,我国境内公募基金规模首次突破33万亿元大关,这也是自20...
法网-高芙2-1逆转萨巴伦卡首... 北京时间6月8日凌晨,2025赛季网球大满贯法国公开赛继续进行,在女单决赛中,赛会2号种子高芙在先丢...
险资年内举牌15次,半年不到举... 如果要问最近几个月最火的资本力量是什么?各大保险公司的保险资本无疑是其中最亮眼的明星,险资不断大规模...