文档章节

android APK安全性校验

luhang
 luhang
发布于 2017/02/09 13:27
字数 661
阅读 61
收藏 0

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(); 
        }  
    }  

.
有问题欢迎学习交流,私信留言,共同学习

本文转载自:http://blog.csdn.net/qq_18413391/article/details/54908328

共有 人打赏支持
luhang
粉丝 3
博文 15
码字总数 571
作品 0
长宁
程序员
私信 提问
校验数字签名防止apk二次打包

Android系统的开放性和免费性等特征让开发者和用户趋之若鹜,用户也渐渐习惯了Android应用的这种免费午餐,但在免费的背后却有着巨大的安全阴影。 “Android APP二次打包”则是盗版正规Andro...

科技创造
2015/03/23
2.6K
2
移动安全时代,如何保护你的app

Android系统的安全性历来备受诟病,在强大的反编译工具下,APK中的代码逻辑一览无余;重打包技术使得各种盗版软件层出不穷,充斥着Android市场,特别是对于金融、电商、游戏等产品的盗版应用...

今生
2015/11/11
487
2
Android Hotpatch系列之-项目介绍

在手淘工作期间,内部有一套解决方案,给线上apk打补丁,直接修复bug,不用客户端升级,有严重线上bug,找到问题,写个patch,推上线就把问题解决了,用过的都说好。前段时间,他们终于把这套...

fneg
2015/08/03
0
24
Android开源框架源码鉴赏:VirtualAPK

关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流。 文章目录 一 Vi...

郭孝星
2018/02/10
0
0
Android 安全访问机制

概述: Android是一个多进程系统,在这个系统中,应用程序(或者系统的部分)会在自己的进程中运行。系统和应用之间的安全性通过Linux的facilities(工具,功能)在进程级别来强制实现的,比如...

长平狐
2012/09/03
174
0

没有更多内容

加载失败,请刷新页面

加载更多

Flink 幕后之内存管理

Flink 幕后之内存管理 引言 目前很多大数据处理框架,例如Hadoop、Spark、Storm、Flink等。它们都基于JVM语言开发(java or scala),运行在JVM上。为了加速合并或者排序(基于磁盘的方式通常...

moyiguke
14分钟前
1
0
风起云涌,看云计算如何赋能媒体行业?

在媒体行业的转型升级中,云计算的出现多维度促进了媒体融合,打破传统媒体行业与新媒体的界限和竞争格局,在媒体素材管理、移动端功能演进的过程中扮演着重要角色,颠覆了传统媒体新闻采编、...

七牛云
17分钟前
0
0
Mybatis开发遇到问题汇总

mybatis 中![CDATA[...]] 在今天使用Mybatis的xml文件中写sql语句时写入了一些特殊字符 如 < > & 等,但解析xml文件的时候会被转义,事实上并不希望它被转义,可以使用<![CDATA[ ]]>. 这是XML...

wangwei2134
25分钟前
0
0
参数验证 @Validated 和 @Valid 的区别

来源:blog.csdn.net/qq_27680317/article/details/79970590 整编:Java技术栈(公众号ID:javastack) Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范......

Java技术栈
27分钟前
0
0
JS实现继承的几种方式

前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。那么如何在JS中实现继承呢?让我们拭目以待。 JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: ...

不负好时光
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部