数字签名

2019-08-23  本文已影响0人  敏徕

基本实现

数字签名实际上就是上面非对称加密时的认证模式,只不过做了一点点的改进,加入了散列算法。大家比较熟悉的散列算法可能就是MD5了,很多开源论坛都采用了这个算法。散列算法有三个特点:一是不可逆的,由结果无法推算出原数据;二是原数据哪怕是一丁点儿的变化,都会使散列值产生巨大的变化;三是不论多么大或者多么少的数据,总会产生固定长度的散列值(常见的为32位64位)。产生的散列值通常称为消息的摘要(digest)。

那么如何通过引入散列函数来保证数据的完整性呢?也就是接收方能够确认消息确实是由发送方发来的,而没有在中途被修改过。具体的过程如下:

发送方将想要进行传递的消息进行一个散列运算,得到消息摘要。

发送方使用自己的私钥对摘要进行加密,将消息和加密后的摘要发送给接收方。

接收方使用发送方的公钥对消息和消息摘要进行解密(确认了发送方)。

接收方对收到的消息进行散列运算,得到一个消息摘要。

接收方将上一步获得的消息摘要与发送方发来的消息摘要进行对比。如果相同,说明消息没有被改动过;如果不同,说明消息已经被篡改。

这个过程可以用下面的一副图来表述:

image.png

我们可以看出,数字签名通过引入散列算法,将非对称加密的认证模式又加强了一步,确保了消息的完整性。除此以外,注意到上面的非对称加密算法,只是对消息摘要进行了加密,而没有对消息本身进行加密。非对称加密是一个非常耗时的操作,由于只对消息摘要加密,使得运算量大幅减少,所以这样能够显著地提高程序的执行速度。同时,它依然没有确保消息不被第三方截获到,不仅如此,因为此时消息是以明文进行传递,第三方甚至不需要发送方的公钥,就可以直接查看消息。

为了解决这样的问题,只需要将非对称加密的认证模式、加密模式以及消息摘要进行一个结合就可以了,这也就是下面的高级模式。

高级实现

由于这个过程比上面稍微复杂了一些,我们将其分为发送方和接收方两部分来看。先看看发送方需要执行的步骤:

将消息进行散列运算,得到消息摘要。

使用自己的私钥对消息摘要加密(认证模式:确保了接收方能够确认自己)。

使用接收方的公钥对消息进行加密(加密模式:确保了消息只能由期望的接收方解密)。

发送消息和消息摘要。

接下来我们看一下接收方所执行的步骤:

使用发送方的公钥对消息摘要进行解密(确认了消息是由谁发送的)。

使用自己的私钥对消息进行解密(安全地获得了实际应获得的信息)。

将消息进行散列运算,获得消息摘要。

将上一步获得的消息摘要 和 第一步解密的消息摘要进行对比(确认了消息是否被篡改)。

可以看到,通过上面这种方式,使用了接收方、发送方全部的四个密钥,再配合使用消息摘要,使得前面提出的安全传递的所有三个条件全都满足了。那么是不是这种方法就是最好的呢?不是的,因为我们已经说过了,非对称加密是一种很耗时的操作,所以这个方案是很低效的。实际上,我们可以通过它来解决对称加密中的密钥传递问题,如果你已经忘记了可以翻到前面再看一看,也就是说,我们可以使用这里的高级实现方式来进行对称加密中密钥的传递,对于之后实际的数据传递,采用对称加密方式来完成,因为此时已经是安全的了。

证书机制

与数字签名相关的一个概念就是证书机制了,证书是用来做什么呢?在上面的各种模式中,我们一直使用了这样一个假设,就是接收方或者发送方所持有的、对方的公钥总是正确的(确实是对方公布的)。而实际上除非对方手把手将公钥交给我们,否则如果不采取措施,双方在网络中传递公钥时,一样有可能被篡改。那么怎样解决这个问题呢?这时就需要证书机制了:可以引入一个公正的第三方,当某一方想要发布公钥时,它将自身的身份信息及公钥提交给这个第三方,第三方对其身份进行证实,如果没有问题,则将其信息和公钥打包成为证书(Certificate)。而这个公正的第三方,就是常说的证书颁发机构(Certificate Authority)。当我们需要获取公钥时,只需要获得其证书,然后从中提取出公钥就可以了。

image.png image.png
上一篇下一篇

猜你喜欢

热点阅读