android APK安全性校验
来源:互联网 发布:懒人淘宝网首页 编辑:程序博客网 时间:2024/05/05 22:20
APK安全性校验
获取签名证书keystore的SHA1值和完整性校验获取的classes.dex的SHA-1哈希值字符串
- 建议后台保存初始值与前端获取sha1值做判断是否可以进行下一步操作
1. 签名证书文件校验码
获取签名证书的SHA1值
public static String getSign(Context ctx) { try { PackageInfo packageInfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES); Signature[] signs = packageInfo.signatures; Signature sign = signs[0]; MessageDigest md1 = MessageDigest.getInstance("MD5"); md1.update(sign.toByteArray()); byte[] digest = md1.digest(); String res = toHexString(digest); MessageDigest md2 = MessageDigest.getInstance("SHA1"); md2.update(sign.toByteArray()); byte[] digest2 = md2.digest(); String res2 = toHexString(digest2); return res2; } catch (Exception e) { e.printStackTrace(); return ""; } }
2. 完整性校验
对签名文件中classes.dex哈希值的校验
Android工程代码经编译打包生成apk包后,开发者需要对其签名才能在安卓市场上发布供用户下载和安装。对apk包签名后,会在原apk包结构基础上加入META-INF文件目录。
META-INF文件目录下含有三个文件:MANIFEST.MF文件、ANDROIDD.SF文件、ANDROIDD.RSA文件,META_INF目录文件结构如下图所示:
其中,MANIFEST.MF文件描述了在签名时,签名工具对apk包中各个文件摘要计算后的哈希值,并对哈希值做了Base64编码。MANIFEST.MF文件中描述的classes.dex文件的SHA-1哈希值如下图所示:
一旦攻击者对APK中反编译并篡改代码,经二次打包签名后的classes.dex文件的SHA-1必定改变,因此,我们可以将该文件中的classes.dex文件的SHA-1哈希值保存起来作为校验对比值,应用程序启动时读取apk安装包中的MANIFEST.MF文件,解析出classes.dex的SHA-1哈希值,然后与原SHA-1哈希值进行比较,判断此APK包代码文件是否被篡改。
通过检查签名文件classes.dex文件的哈希值来判断代码文件是否被篡改的java实现代码如下所示:
通过检查签名文件classes.dex文件的哈希值来判断代码文件是否被篡改
@param orginalSHA 原始Apk包的SHA-1值
“`
public static void apkVerifyWithSHA(Context context, String baseSHA) { String apkPath = context.getPackageCodePath(); // 获取Apk包存储路径 try { MessageDigest dexDigest = MessageDigest.getInstance("SHA-1"); byte[] bytes = new byte[1024]; int byteCount; FileInputStream fis = new FileInputStream(new File(apkPath)); // 读取apk文件 while ((byteCount = fis.read(bytes)) != -1) { dexDigest.update(bytes, 0, byteCount); } BigInteger bigInteger = new BigInteger(1, dexDigest.digest()); // 计算apk文件的哈希值 String sha = bigInteger.toString(16); fis.close(); if (!sha.equals(baseSHA)) { // 将得到的哈希值与原始的哈希值进行比较校验 Process.killProcess(Process.myPid()); // 验证失败则退出程序 } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
“`
.
有问题欢迎学习交流,私信留言,共同学习
0 0
- android APK安全性校验
- Android APK 签名校验
- Android应用中的APK安全性问题
- android apk 自我保护技术-完整性校验
- android apk 自我保护技术-完整性校验
- 批量校验android apk包的渠道号 工具
- 批量校验android apk包的渠道号 工具
- android apk 防止反编译技术第五篇-完整性校验
- android apk 防止反编译技术第五篇-完整性校验
- android apk 防止反编译技术第五篇-完整性校验
- android apk 防止反编译技术第五篇-完整性校验
- 安全性测试:输入校验规则
- APK完整性校验代码
- APK签名校验绕过
- APK签名校验绕过
- APK校验码校验规则
- APK签名校验分析
- APK自我保护 - DEX/APK/证书校验
- IntelliJ IDEA的在线注册码生成页面
- redis key 设计技巧
- 数据结构实验之二叉树三:统计叶子数
- Maven仓库搭建(一):一台HTTP服务器即可(Tomcat、Apache或Nginx)
- GAN对抗网络相关资源
- android APK安全性校验
- RN7_React-Native实战(1)
- 改变UIAlertController的标题、内容的字体和颜色
- 在腾讯云的Linux(ubuntu)安装tomcat的步骤
- opencv3.0在linux下的安装
- CheckStyle-IDEA插件在Android Studio或IntelliJ IDEA的使用
- nginx 502错误原因及解决办法
- HTML常用标签(表单)(四)
- PHP中的AJAX无刷新分页