散列算法
散列算法不属于加密算法,目前经常使用的有两种:
1. MD5
对任意长度的数据计算生成128位固定长度的MD5值,主要的特定:
生成的MD5值一定是128位,不管输入数据多大
原始数据只要有修改,MD5值就会发生很大的改变
容易计算,也就是算法不会很耗时
很少会发生碰撞
MD5的算法过程主要为:填充 –> 分组进行位运算 –> 得到MD5值
随便找个apk解压,会看到有个META-INF文件夹,这个就是跟apk的签名有关的,里面会有三个文件:MANIFEST.MF,ANDROID.SF,ANDROID.RSA。
MANIFEST.MF
这个保存了apk中所有文件的消息摘要值,遍历apk所有的文件,对于每一个文件,都用SHA1(或者SHA256)计算其摘要,然后再做Base64编码,得到的值和文件路径组成key-value,写入到MANIFEST.MF文件中。示例如下:
Manifest-Version: 1.0
Name: AndroidManifest.xml
SHA1-Digest: bVaU03v/s2D1ZnfNly3inexGx8E=
Name: LICENSE-junit.txt
SHA1-Digest: xa0kHcW0TK5p5IxSU7ej/t5BXqE=
Name: LICENSE.txt
SHA1-Digest: dTF36wNXk3NZRvp51lzE8FW7KYQ=
Name: R/a/gu.xml
SHA1-Digest: EImnskGmHG13zzjLQsBz7AaLVGU=
Name: R/a/hf.xml
SHA1-Digest: 1UI3hZQyzdEjUG/usTIhx245zDM=
......
CERT.SF
这个是对MANIFEST.MF中的所有条目,再次进行SHA1+Base64处理,最终的结果同样组成key-value,写入到CERT.SF文件中。示例如下:
Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA1-Digest-Manifest: ktRWgoJhhmR9UKW2bkvJv9sWbwg=
X-Android-APK-Signed: 2
Name: AndroidManifest.xml
SHA1-Digest: vPXU1jU9CV5ThOTQ1dhPspFhSDY=
Name: LICENSE-junit.txt
SHA1-Digest: i/XNa154J6oo2MWLxVtyjXAag2Q=
Name: LICENSE.txt
SHA1-Digest: dtxUfw7RZZWDxsyMx++B4WEugqM=
Name: R/a/gu.xml
SHA1-Digest: QgyDHCXLVsWQFsZVYbvZnimS81w=
Name: R/a/hf.xml
SHA1-Digest: N8tGKy5jd9e3TmOtLTmfwtUW1LM=
......
CERT.RSA
首先这里需要一个证书,其实就是平时开发用到签名文件,然后利用这个证书里面的私钥对CERT.SF计算得到签名,然后把这个签名和证书写入到CERT.RSA中,注意写入的证书包含了公钥信息,私钥是不会写进去的。这里用到的证书是自签名的,也就是开发者自己生成,不用要求必须是CA机构发布的。