分享

Android开发资料

 昵称Q99IG 2016-07-24
        加密技术是最常用的安全保密手段,利用技术手段把明文变为密文(加密)传送,到达目的地后再用相同或不同的手段还原(解密)。常见的加密算法可以分成三类,对称加密算法,非对称加密算法和HASH算法。前两类是可逆的,即加密后的密文仍然可以转换成明文,但Hash算法是不可逆的,即使在有源码及密文的情况下也无法将明文还原出来,如MD5算法。

        由于Java的语言特点及Android的开放性质,出现了越来越多的恶意程序。谷歌Android市场在也曾多次遭恶意开发者上传基于正常应用篡改后的恶意软件,虽然这些软件已经被查出,但在将其下架前已经造成了几十万用户被感染。这些恶意程序都是以已存在的成名的应用为载体,经过二次处理后植入恶意代码,重新签证后再次向市场发布,诱导用户下载使用。为了避免这种情况的发生,保护自己的应用在未经自己允许的情况下惨遭篡改,保护自己的应用不会被人利用做一些伤害用户的行为,本章节中将介绍这样一种保护机制。

        Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥(即.keystore签证文件)则保存在程序开发者的手中,签证后的信息摘要保存在APK包中的.RSA文件中。数字证书用来标识应用程序的作者与应用程序之间建立信任关系。一旦证书被篡改,则.RSA文件被替换了,即表明应用程序的原作者不再为该应用负责。依照这个原理,可以在第一次运行程序时读取APK中的.RSA摘要信息对其进行判断是否是与经应用原作者签名后产生的信息一致。如果一致则让程序正常运行;如果不一致则表明应用被篡改过,提示用户并终止运行。

        可以通过以下方法获取APK包中的.RSA信息:

1Signature[] sigs = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).signatures;
2byte[] data = sigs[0].toByteArray();

        在Android官方文档中,对Signature类的定义是:在应用程序包及对该包进行签名的证书间建立起不透明的、不可改变的代表关系。执行Signature.toByteArray()将返回.RSA的字节信息。

        下面将把这些字节转换成可阅读的数字指纹信息:

1// alg参数指定算法
2MessageDigest algorithm = MessageDigest.getInstance(alg);
3// 将状态重围到初始化,准备好进行计算Hash值。
4algorithm.reset();
5// 返回计算后的Hash值
6algorithm.update(data);
7// 将Hash值转为可读的16进制文本
8byte[] dataHash = algorithm.digest();

        通过MessageDigest来计算数字指纹信息,其算法核心是HASH函数。哈希函数提供了这样一种计算过程:输入一个长度不固定的字符串,返回一串定长度的字符串,即HASH值。

        HASH函数主要可以解决以下两个问题:一是无法通过HASH值得到原报文;二是不存在不同报文经HASH操作后生成相同HASH值。

        这样在数字签名中就可以解决验证签名和用户身份验证、不可抵赖性的问题。在获取MessageDigest时要指定所使用的算法名称,常见的算法是专门用于加密处理的MD5和SHA1。这两种算法产生一种128位信息摘要,除彻底地搜寻外,没有更快的方法对其加以攻击,而其搜索时间一般需要1025年之久,这样即可保证信息在一段时间内的有效性与安全性。

        使用MessageDigest时,养成一个良好的习惯是在读取数据前将其reset()置初始化状态,即使这个实例是刚实例化的,这样尽量可以避免之前已读的冗余数据对最后的结果产生负作用。接下来就是使用update()方法读取待计算的数据,完成后调用digest()将返回计算后的HASH值dataHash数组。最后为了可读性,通过自己实现的toHexString()把HASH值由byte转为16进制文本。

        在得到dataHash时,即可对应用程序是否正版进行判断了,但一般为了简便,把提前写入的正版的指纹信息与最后HexString值进行比较,从而得出应用程序是否被篡改的结果。比较代码如下:

01txtVerify.setText(alg + '\n');
02 
03String result = 'This soft is a pirated software.';
04 
05if (alg.equals(MD5)) {
06        txtVerify.append('Original:' + '\n' + HASH_VALUE_MD5 + '\n');
07        if (HASH_VALUE_MD5.equals(hexInfo)) {
08                result = 'This soft is a genuine software';
09        }
10} else if (alg.equals(SHA1)) {
11        txtVerify.append('Original:' + '\n' + HASH_VALUE_SHA1 + '\n');
12        if (HASH_VALUE_SHA1.equals(hexInfo)) {
13                result = 'This soft is a genuine software';
14        }
15}
16 
17txtVerify.append('Current:' + ':\n' + hexInfo + '\n');
18txtVerify.append(result);

        以上代码中的HASH_VALUE_MD5和HASH_VALUE_SHA1分别是使用Code_Test_Key.keystore签名后的APK实际计算出的HASH值。

        Demo运行效果如下:

QQ截图20120803142226.png

2012-8-3 16:33:32 上传
下载附件 (199.24 KB)


图17-1  验证MD5值


QQ截图20120803142213.png

2012-8-3 16:33:41 上传
下载附件 (201.63 KB)


图17-2  验证SHA1值


Demo源代码下载:Code_Test.rar(825.11 KB, 下载次数: 308, 售价: 1 资源分)

2012-8-3 16:34:55 上传
下载次数: 308
售价: 1 资源分  [记录] [购买]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多