APP安全之APK完整性校验

来源:互联网 发布:淘宝客单页面模板 编辑:程序博客网 时间:2024/04/28 17:35

一、认识APK安全性

危害

可以通过修改客户端文件篡改客户端行为。攻击者可以让客户端显示自己制作的钓鱼网站,偷取用户信息

二、完整性校验原理

完整性校验的几种方式

  1. CRC校验
  2. MD5值校验
  3. SHA1值校验

常见android完整性检测

  1. 检测签名
  2. 校验classes.dex
  3. 校验整个apk

检测签名

Android对每一个Apk文件都会进行签名,在Apk文件安装时,系统会对其签名信息进行比对,判断程序的完整性,从而决定该Apk文件是否可以安装,在一定程度上达到安全的目的。

  1. MANIFEST.MF:这是摘要文件。程序遍历Apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。如果你改变了apk包中的文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFEST.MF的检验信息不同,于是程序就不能成功安装。
  2. CERT.SF:这是对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。
  3. CERT.RSA文件中保存了公钥、所采用的加密算法等信息。系统对签名文件进行解密,所需要的公钥就是从这个文件里取出来的。 
    这三个文件在apk META-INFO文件夹

结论:从上面的总结可以看出,META-INFO里面的说那个文件环环相扣,从而保证Android程序的安全性。(只是防止开发者的程序不被攻击者修改,如果开发者的公私钥对对攻击者得到或者开发者开发出攻击程序,Android系统都无法检测出来。)

虽然系统通过以上方式可以防止,但如果是root的手机就不安全了,建议通过服务器来校验,

校验classes.dex

用crc32对classes.dex文件的完整性进行校验

public class MainActivity extends Activity {@Overrideprotected void onCreate(BundlesavedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    String apkPath = getPackageCodePath();    Long dexCrc = Long.parseLong(getString(R.string.classesdex_crc));    //建议将dexCrc值放在服务器做校验    try    {        ZipFile zipfile = new ZipFile(apkPath);        ZipEntry dexentry = zipfile.getEntry("classes.dex");        Log.i("verification","classes.dexcrc="+dexentry.getCrc());        if(dexentry.getCrc() != dexCrc){        Log.i("verification","Dexhas been modified!");        }else{        Log.i("verification","Dex hasn't been modified!");        }    } catch (IOException e) {     // TODO Auto-generated catch block     e.printStackTrace();    }   }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

校验整个apk

用哈希值对整个apk完整性进行校验

public class MainActivity extends Activity {@Overrideprotected void onCreate(BundlesavedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main); String apkPath = getPackageCodePath();     MessageDigest msgDigest = null;     try {        msgDigest = MessageDigest.getInstance("SHA-1");        byte[] bytes = new byte[1024];        int byteCount;        FileInputStream fis = new FileInputStream(new File(apkPath));        while ((byteCount = fis.read(bytes)) > 0)        {            msgDigest.update(bytes, 0, byteCount);        }        BigInteger bi = new BigInteger(1, msgDigest.digest());        String sha = bi.toString(16);        fis.close();        //这里添加从服务器中获取哈希值然后进行对比校验        } catch (Exception e) {            e.printStackTrace();        }   }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

我们将把crc值和sha1值放在服务器做处

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四川住房城乡建设厅 西安住房公积金管理中心 住房公积金贷款额度 沧州住房公积金查询 个人住房公积金查询入口 银行住房贷款利率计算器 合肥市住房公积金管理中心 山东省住房和城乡建设厅 2019商业住房贷款利率 住房和城乡建设部 长春住房公积金 四川省住房城乡建设厅首页 新乡市住房公积金管理中心 住房贷款利率计算器 邵阳市住房公积金管理中心 邵阳住房公积金 商业住房贷款利率 陕西省住房公积金管理中心 合肥住房公积金管理中心 长春市住房公积金 山东省住房城乡建设厅 2019各银行住房商贷利率一览表 住房公积金查询入口 陕西省住房和城乡建设厅网 沧州住房公积金个人查询入口 包头市住房公积金管理中心 佛山住房公积金中心 个人住房商业性贷款 住房公积金装修贷款能贷多少 邵阳住房公积金管理中心 工资4000住房公积金一般交多少 西安住房保障管理局网站 佛山住房公积金 住房城乡建设部 河南省住房和城乡建设厅网 北京住房公积金 广州住房公积金管理中心 西安住房公积金 成都住房公积金管理中心 宜春住房公积金 安徽省住房和城乡建设厅