Android签名机制目的是确保app的可靠通信,其一,要确定消息的来源确实是其申明
的那个人;其二,要保证信息在传递的过程中不被第三方篡改,即使被篡改了,也可以
发觉出来。
所谓数字签名,就是为了解决这两个问题而产生的,它是对非对称加密技术与数字摘要
技术的一个具体的应用。
对于消息的发送者来说,先要生成一对公私钥对,将公钥给消息的接收者。
如果消息的发送者有一天想给消息接收者发消息,在发送的信息中,除了要包含原始的
消息外,还要加上另外一段消息。这段消息通过如下两步生成:
1)对要发送的原始消息提取消息摘要;
2)对提取的信息摘要用自己的私钥加密。
通过这两步得出的消息,就是所谓的原始信息的数字签名。
而对于信息的接收者来说,他所收到的信息,将包含两个部分,一是原始的消息内容,
二是附加的那段数字签名。他将通过以下三步来验证消息的真伪:
1)对原始消息部分提取消息摘要,注意这里使用的消息摘要算法要和发送方使用的一致;
2)对附加上的那段数字签名,使用预先得到的公钥解密;
3)比较前两步所得到的两段消息是否一致。如果一致,则表明消息确实是期望的发送者
发的,且内容没有被篡改过;相反,如果不一致,则表明传送的过程中一定出了问题,
消息不可信。
通过这种所谓的数字签名技术,确实可以有效解决可靠通信的问题。如果原始消息在传
送的过程中被篡改了,那么在消息接收者那里,对被篡改的消息提取的摘要肯定和原始
的不一样。并且,由于篡改者没有消息发送方的私钥,即使他可以重新算出被篡改消息
的摘要,也不能伪造出数字签名。
那么数字签名呢?
综上所述,数字签名其实就是只有信息的发送者才能产生的别人无法伪造的一段数字
串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
不知道大家有没有注意,前面讲的这种数字签名方法,有一个前提,就是消息的接收者
必须要事先得到正确的公钥。如果一开始公钥就被别人篡改了,那坏人就会被你当成好
人,而真正的消息发送者给你发的消息会被你视作无效的。而且,很多时候根本就不具
备事先沟通公钥的信息通道。那么如何保证公钥的安全可信呢?这就要靠数字证书来解
决了。
所谓数字证书,一般包含以下一些内容:
证书的发布机构(Issuer)
证书的有效期(Validity)
消息发送方的公钥
证书所有者(Subject)
数字签名所使用的算法
数字签名
可以看出,数字证书其实也用到了数字签名技术。只不过要签名的内容是消息发送方的
公钥,以及一些其它信息。但与普通数字签名不同的是,数字证书中签名者不是随随便
便一个普通的机构,而是要有一定公信力的机构。这就好像你的大学毕业证书上签名的
一般都是德高望重的校长一样。一般来说,这些有公信力机构的根证书已经在设备出厂
前预先安装到了你的设备上了。所以,数字证书可以保证数字证书里的公钥确实是这个
证书的所有者的,或者证书可以用来确认对方的身份。数字证书主要是用来解决公钥的
安全发放问题。
综上所述,总结一下,数字签名和签名验证的大体流程如下图所示: