关于https://blog.csdn.net/niyingxunzong/article/details/79977580 签名以及其相关内容的总结。
一、概述
这个玩意简单说起来很简单,详细描述起来很复杂,复杂在什么地方呢,首先有一块陌生的知识点,包括但不限于证书,数字签名,加密,密钥,keytool,keystore,md5,sha1,sha256,base64编码,文件hash等等。这些东西不是属于哪门语言,或者属于哪个平台。
二、还是从Key Store和keytool说起吧
1、如何生成一个签过名的apk呢?
现在AndroidStudio
越来越强大了,直接选择 Build–>Generate Singed APK
然后选择next 就可以。
2、这个keystore
什么东西呢?如果硬要翻译的话,叫做key(密钥)store(仓库)。顾名思义里面的存放的是密钥,这个密钥分为公钥和私钥。在 keystore 中的每个条目都有自己单独的密码保护。
3、什么是keytool
?
keytool
是jdk
提供的一个把钥匙和证书储存到keystore
中的工具。
三、数字签名和数字证书
公钥和私钥的两种作用:公共钥匙用来加密数据,私有钥匙用来计算签名;公钥加密的消息只能用私钥解密,私钥签名的消息只能用公钥检验签名。
数据摘要:主要有MD5
,SHA-1
等,用直白的话来说就是通过算法,对输入的消息(一般是一些二进制数据)运算后得到一个固定长度的输出,一般来说输入不同,得到的摘要也是不同的,并且没有办法通过摘要还原数据。(其实这也很好理解,顾名思义,好比我们语文中对一篇文章做摘要,不同的文章做的一般不同,而且没法通过摘要得到整篇文章的原文)
数字签名: 数字签名是非对称密钥加密技术与数字摘要技术的应用。(一句话总结一下就是,私钥加密后的消息摘要就是数字签名)
数字签名一种应用场景 :“发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。
数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将发生变化。不同的文件将得到不同的数字摘要。 一次数字签名涉及到一个哈希函数、发送者的公钥、发送者的私钥。”
但是在【数字签名一种应用场景】里面描述的有个问题,就是前提是接收消息的一方,拿到的公钥必须是正确的。如果公钥都被篡改了,那么后面的一切都错了。数字证书可以保证数字证书里面的公钥确实是这个证书所有者的,这样就可以解决公钥的安全发放了。那么这个证书是哪里来的呢。这就用到了一种约定。我们理论上认为某些有公信力的机构发放的证书是安全的。我们把这些发放证书的机构叫做CA(Certificate Authority)。CA用自己的私钥对申请证书的人的公钥和一些基本信息,做签名,然后把申请者的公钥,基本信息,和数字签名放到一起组成一个证书。而CA本身也会生成一个证书,是自签名的,也叫根证书,会内置在操作系统里面。
四、apk的签名过程
image从上图可以看到,签名发生在打包过程中的倒数第二步,而且签名针对的是已经存在的apk包,并不会影响我们写的代码。
Android的签名,大致的签名原理就是:对未签名的apk里面的所有文件计算hash,然后保存起来(
MANIFEST.MF
),然后在对这些hash计算hash保存起来(CERT.SF
),然后在计算hash,然后再通过我们上面生成的keystore
里面的私钥进行加密并保存(CERT.RSA
)。image
网友评论