[长篇]从Android中RSA算法到密码学非对称性加密算法到大数因子多项式分解(一)
全文我已写完,但想了想,若一气贴出来篇幅巨大,容易直接把人打蒙。所以采用分期刊登的形式。
今天先说说:
android apk程序中的签名
a. 签名在哪?
一言蔽之:在apk包的META-INF\目录下
随便将一个.apk写该后缀为.zip,解压,类似如图所示。

1. META-INF\ (注:签名后的信息);
2. res\ (注:存放资源文件的目录) ;
3. AndroidManifest.xml (注:程序全局配置文件) ;
4. classes.dex (注:Dalvik字节码);
5. resources.arsc (注:编译后的二进制资源文件)。
META-INF\文件中有三个文件,分别是MANIFEST.MF, CERT.SF, CERT.RSA,如图所示。

现在有一个问题就是,三个文件怎么产生的的——签名产生的,第二个问题签名是怎么做的呢?这里Android提供了APK的签名工具signapk,通过xxx.keystore(java的密钥库、用来进行通信加密用的、比如数字签名。keystore就是用来保存密钥对的,比如公钥和私钥)提供的信息,对APK进行签名,生成的META-INF\文件。
1.MANIFEST.MF文件:遍历APK包中的每一个文件,利用SHA1算法生成这些文件的摘要信息。
2.CERT.SF文件:CERT.SF中保存的是MANIFEST.MF的摘要值
3.CERT.RSA文件:这个文件保存了签名和公钥证书。并且这个证书是自签名的。签名的生成一定会有私钥参与,签名用到的信息摘要就是CERT.SF内容。
b. 为什么apk要签名?
一言蔽之:签名后的apk中因为有每个包文件的消息摘要,从而保证了apk在传输过程中的数据完整性。因为开发者持有私钥,用户们持有公钥,所以保证了用户和开发者之间有效正确的认证关系,于是才实现下面所列的三条功能。
所有的Android应用程序都要求开发人员用一个证书进行数字签名,android系统不会安装没有进行签名的由于程序。平时我们的程序可以在模拟器上安装并运行,是因为在应用程序开发期间,由于是以Debug面试进行编译的,因此ADT根据会自动用默认的密钥和证书来进行签名,而在以发布模式编译时,apk文件就不会得到自动签名,这样就需要进行手工签名。
? ?
给apk签名可以带来以下好处:
1. 应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
2.应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块。
3.代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。
不同的应用程序之间,想共享数据,或者共享代码,那么要让他们运行在同一个进程中,而且要让他们用相同的证书签名。
c.签名的构成
一言蔽之:用非对称性加密法中的私钥加密过的,消息摘要+公钥+公钥拥有者信息。
1.消息摘要 -Message Digest
简称摘要,请看英文翻译,是摘要,不是签名,网上几乎所有APK签名分析的文章都混淆了这两个概念。简单的说消息摘要就是在消息数据上,执行一个单向的Hash函数,生成一个固定长度的Hash值,这个Hash值即是消息摘要也称为数字指纹,消息摘要有以下特点:
1. 通过摘要无法推算得出消息本身
2. 如果修改了消息,那么摘要一定会变化(实际上,由于长明文生成短摘要的Hash必然会产生碰撞),所以这句话并不准确,我们可以改为:很难找到一种模式,修改了消息,而它的摘要不会变化(抗冲突性)。
消息摘要的这种特性,很适合来验证数据的 完整性,比如在网络传输过程中下载一个大文件BigFile,我们会同时从网络下载BigFile和BigFile.md5,BigFile.md5保存 BigFile的摘要,我们在本地生成BigFile的消息摘要,和BigFile.md5比较,如果内容相同,则表示下载过程正确。
注意,消息摘要只能保证消息的完整性,并不能保证消息的不可篡改性。
2.数字签名-Signature
数字签名就是信息的发送者用自己的私钥对消息摘要加密产生一个字符串,加密算法确保别人无法伪造生成这段字符串,这段数字串也是对信息的发送者发送信息真实性的一个有效证明。数字签名是非对称密钥加密技术 + 数字摘要技术 的结合。
数字签名技术是将信息摘要用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的信息摘要,然后接收者用相同的Hash 函数对收到的原文产生一个信息摘要,与解密的信息摘要做比对。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改;不同则说明信息被修改过,因 此数字签名能保证信息的完整性。并且由于只有发送者才有加密摘要的私钥,所以我们可以确定信息一定是发送者发送的。
3.数字证书 - Certificate
数字证书是一个经证书授权 中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。CERT.RSA包含了一个数字签名以及一个数字证书。
需要注意的是Android APK中的CERT.RSA证书是自签名的,并不需要这个证书是第三方权威机构发布或者认证的,用户可以在本地机器自行生成这个自签名证书。
下一期我来解释下:什么是公钥私钥,什么是对称性和非对称性加密法。以及它们的特性和应用。
下一篇:从Android中RSA算法到密码学非对称性加密算法到大数因子多项式分解(二)
