android APK安全性校验 您所在的位置:网站首页 as调试apk修改了资源就检测apk android APK安全性校验

android APK安全性校验

2024-07-14 18:46| 来源: 网络整理| 查看: 265

扫描上面公众号查看更多面试技术分享,为你的人生加油!努力

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();       }   }   --------------------- 原文:https://blog.csdn.net/qq_18413391/article/details/54908328 版权声明:本文为博主原创文章,转载请附上博文链接!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有