数字证书和数字签名

数字签名是什么?
RSA算法原理(一)
RSA算法原理(二)
RSA数字签名与加密、解密间的关系

在网络通信中,可以通过非对称加密的方式保证通信的安全。任何人都可以生成自己的秘钥对,用来对通信提供加密,认证的功能。比如,A 可以生成一对自己的公钥和私钥,然后将公钥发布出去,自己保存好私钥。秘钥对的使用可以分为两部分,一是当其他人想安全的发送保密信息给 A 时,就用 A 的公钥加密信息,然后将密文发给 A,因为只有 A 自己知道可以解开密文的私钥,所以这样通信是保密的。另一部分是,如果 A 想避免有人冒充自己向其他人发送消息的话,就可以用私钥将自己发送的内容加密并将密文随内容一同发送,当其他人收到消息后,就用 A 公开的公钥对随内容一同发送的密文解密,解密后与原内容比对,如果一致,就可以证明内容确实是 A 发送的,且内容没有被修改过,因为只有 A 才能通过私钥加密原文。简单的说就是:

  • 加密:公钥加密、私钥解密
  • 认证:私钥加密、公钥解密

数字证书(digital certificate)

上述中的一个问题是,如何保证其他人能正确拿到 A 的公钥,因为如果公钥是错误的,那么就可以进行相应的伪装攻击了。这时,就需要数字证书的帮助了。比如 A 是服务器,那么可信任的第三方证明机构,即证书中心(certificate authority,简称CA),用自己的私钥对服务器的公钥和一些相关信息进行加密就生成了数字证书,相关信息包括对应的网址,证书的颁发机构,过期时间等。客户端与服务器进行安全连接时,服务器将自己的数字证书发送给客户端,如果客户端是浏览器,其有自己的证书管理器,即内置证书中心的公钥,可以解密数字证书获取服务器的公钥,如果这张数字证书不是由受信任的机构颁发的或者数字证书记载的网址与正在浏览的网址不一致,浏览器都会发出警告。当然也可以从证书中心的官方网站下载其公钥用于解密数字证书,证书中心发布数字证书的意义在于,可以使浏览器确定使用的是真正的服务器的公钥进行加密解密,而不是其他人伪造的公钥。之后客户端就可以用正确的公钥加密信息发送给服务器了。

数字签名(digital signature)

上述中的第二部分的目的在于认证而不是保密,在这种情况下,所有人都可以看到发送的内容,但没有人可以改动内容或者甚至假扮 A 发送内容,因为随内容还附有认证信息,而这个通过 A 自己的私钥加密的密文就是数字签名。功能就像现实中的合同文件上的手写签名或手印一样。在真正实现时,不可能将通信的所有内容全部加密作为签名,这样会大量增加网络通信需要传输的数据。解决方法是信息发送方用Hash函数将内容生成摘要,然后用自己的私钥对摘要进行加密,就生成了数字签名。数字签名随内容一同发送,接收方收到信息后,用发送方的公钥对数字签名解密,解密成功就证明内容确实是公钥对应的发送方发送的,然后接受方同样的对内容使用Hash函数生成摘要,接着与解密后的摘要进行比较,如果相同就证明内容未被修改过。因为保证公钥正确性的问题,所以一般将数字证书也随内容和签名一同发送。

关于数字签名的一个问题

网上关于数字签名验证时的一个争论,一部分人认为,当如果通过公钥解密签名成功,就可以证明消息 A 发送的,之后再将hash值比较证明的是原文是否被篡改过。另一种观点是,公钥的解密不存在成功还是失败的问题,需要通过第二步的hash值比较来证明,消息确实是 A 发送的且没有被篡改过。
以RSA算法为例,单纯的从其原理上来说,确实没有解密失败的概念,因为本身解密过程只是一次乘方和取模的运算。即使以不匹配的公钥去解密,也是可以计算出一个值的
但根据RFC2313来看,数字签名包括4个步骤:消息散列,DER数据编码,RSA私钥加密和字节串到位串的转换。而解密就是上述过程的逆过程,位串到字节串的转换,RSA公钥解密,DER数据解码,得到解密后的散列值,最后与原始数据散列值进行比较。如果是不匹配的公钥解密,可能会因为解密时的标记位不对应等原因而直接报错,即解密失败。也就是根据能否解密成功来达到防抵赖性,根据散列值的比较达到防伪造性。
而大部分语言的标准实现应该都是输入公钥,原内容,和签名,输出true或false。即无法知道是内容被伪造还是其他人伪造了签名,总之是签名验证失败。

你可能感兴趣的:(数字证书和数字签名)