哈希算法
常见有MD5(128位),SHA1(160位),作用是将任意长度的数据(明文)列经过哈希函数计算后得到一个固定长度的二进制数据(密文)。
注意:哈希算法是单向的,不可逆的,密文不可能推出明文。(当然已知的明文以及对应的哈希值是可以被知道的,通过这种方法是可以推出明文的)
数字摘要/数字指纹和数字签名
APK签名是为了保证APK的完整性和来源的真实性。核心思想均是计算APK内容的hash,再使用签名算法对hash进行签名。校验时通过签名者公钥解密签名,再与校验者计算的APK内容hash进行比对,一致则校验通过。
将apk文件(明文)经过哈希计算得到的二进制数据(密文)称为数字摘要/数字指纹。对数字摘要再进行一次加密(此次采用私钥加密)得到数字签名。校验过程如图。
注意:
- 私钥公钥这种不对称加密技术,是可以从密文中推出明文的,也即对应图中公钥可以解密数字签名得到数字摘要;公钥加密,私钥解密,反之亦然。
- apk文件中的META-INF文件夹是存放签名的,其不参与哈希计算。其是后加入的文件,也即是说,在签名前apk文件是不包括这个文件夹的。
数字证书
接收方获得公钥和哈希算法类型的地方。所以流程的完整版如下:
总结
- 从apk文件(不包括META-INF)可以提取出
指纹信息
,应用文件一旦修改,指纹信息就会变化。 - 开发者使用私钥对指纹信息进行加密得到
签名
,将签名信息还有公钥保存到apk的META-INF
文件夹下。 - 用户使用得到的公钥对签名进行解密。得到apk的指纹信息。将该指纹信息与apk 计算得到的指纹信息进行对比。如果一致,说明,文件是未经修改的。
- 当然如果应用被二次打包,整个签名信息和公钥一起被替换,则用户无法知道apk是否完整。
后续总结
- 私钥可以推导出公钥
- 公钥无法推导出私钥
数据A 私钥 = 数据B; 数据B 公钥 = 数据A. 即 数据A 私钥 公钥 = 数据A
此过程中,私钥用途是签名,公钥验签。
数据B 公钥 = 数据A; 数据A 私钥 = 数据B. 即 数据B 公钥 私钥 = 数据B
此过程中,私钥用途是解密,公钥加密。
- 非对称加密无论用于签名验签还是通信加密,本质是一样的原理,只不过是先用公钥加密还是先用私钥加密罢了。