Loading... ## 哈希算法 常见有MD5(128位),SHA1(160位),作用是将任意长度的数据(明文)列经过哈希函数计算后得到一个固定长度的二进制数据(密文)。 注意:哈希算法是单向的,不可逆的,密文不可能推出明文。(当然已知的明文以及对应的哈希值是可以被知道的,通过这种方法是可以推出明文的) ## 数字摘要/数字指纹和数字签名 APK签名是为了保证APK的完整性和来源的真实性。核心思想均是计算APK内容的hash,再使用签名算法对hash进行签名。校验时通过签名者公钥解密签名,再与校验者计算的APK内容hash进行比对,一致则校验通过。 ![签名校验简化版](https://s1.ax1x.com/2020/03/20/82CEbq.png) 将apk文件(明文)经过哈希计算得到的二进制数据(密文)称为数字摘要/数字指纹。对数字摘要再进行一次加密(此次采用私钥加密)得到数字签名。校验过程如图。 注意: * 私钥公钥这种不对称加密技术,是可以从密文中推出明文的,也即对应图中公钥可以解密数字签名得到数字摘要;公钥加密,私钥解密,反之亦然。 * apk文件中的META-INF文件夹是存放签名的,其不参与哈希计算。其是后加入的文件,也即是说,在签名前apk文件是不包括这个文件夹的。 ## 数字证书 接收方获得公钥和哈希算法类型的地方。所以流程的完整版如下: ![签名校验带证书完整流程](https://s1.ax1x.com/2020/03/20/82F4Qe.png) ## 总结 1. 从apk文件(不包括META-INF)可以提取出 `指纹信息` ,应用文件一旦修改,指纹信息就会变化。 2. 开发者使用私钥对指纹信息进行加密得到 `签名`,将签名信息还有公钥保存到apk的`META-INF`文件夹下。 3. 用户使用得到的公钥对签名进行解密。得到apk的指纹信息。将该指纹信息与apk 计算得到的指纹信息进行对比。如果一致,说明,文件是未经修改的。 4. 当然如果应用被二次打包,整个签名信息和公钥一起被替换,则用户无法知道apk是否完整。 最后修改:2021 年 01 月 05 日 01 : 14 PM © 允许规范转载