我们有这样的一个场景,有发送方,接收方,第三方。发送方想要发送消息给接收方,第三方想要截取消并篡改消息,然后再转发给接收方。
怎样才能衬得上是安全的交流方式呢?一般来说需要满足下面的三个条件:
完整性(消息不被篡改),保密性(第三方无法解密),可认证性(接收方知道消息是由谁发送的)。
首先,我们来讲下MD5加密,严格来说,MD5并不能称为加密,它只是一种散列运算,对消息进行散列运算,可以获得消息的摘要(Digest,指纹)。
MD5算法有三个特点,
1. 散列算法是不可逆的,可以将散列运算理解为单向的加密:根据原消息运算得到摘要,根据摘要,无法推导出原消息。比如只要有一个完整的人,就可以获取它的指纹;但是如果只有指纹,是无法获取这个人的全部信息的。
2.任何不同的文件,哪怕只有一个字节的细微差别,得到的摘要都是完全不同的。
3.无论原始消息的大小如何,运算得到的摘要信息是固定长度的。
下面是判断消息是否被篡改的流程。
发送方对消息进行散列运算,得到消息摘要,发送消息摘要和消息,并说明摘要所使用的散列算法,如MD5。
接收方获得消息和摘要,使用相同的散列算法对收到的消息进行散列运算,获得新的摘要
接收方判断发送方的摘要和自己生成的摘要是否相同,相同则认为消息没有被篡改,否则就被篡改了。
但是这个不能保证第三方截取消息,篡改消息,重新生成摘要,再转发。
对称加密
对称加密表示加密解密使用相同的密钥,对称加密算法DES(数据加密标准),AES(高级加密标准)等。
对称加密需要双方都持有密钥,并保证密钥不被泄露。但是发送至和接受者总要有一次初始的通信,用来传递密钥,此时如何保证安全。
非对称加密
非对称加密有一组密钥对,一个是对外公开的,任何人都可以获取,称为公钥。一个是自行保管并严格保密的,称为私钥。消息由公钥加密则只能由私钥解密,由私钥加密只能由公钥解密。通过RSA算法加密解密。
这种加密方式,第三方没有私钥,是无法解密的。但是公钥是任何人都可以获得,任何人都可以用公钥来加密并发送给接收者,因此它无法满足条件可认证性。
认证模式
在认证模式中,有消息的发送方发布公钥,持有私钥,步骤如下
1.发送方公布自己的公钥,任何人都可以获得
2.发送发使用自己的私钥对消息进行加密,然后发送
3.接收方使用发送方的公钥对消息进行解密。
在这种模式下,假如发送方A,接收方B,因为B持有A的公钥,所以B能够解密并且知道消息是由A发送过来的。这样就满足了可认证性的条件
但是因为A的公钥是公开的,所以第三方截取了消息都能通过公钥解密,消息相当于是公开的。不满足保密性
非对称加密运算过程相对耗时,不适合大数据。因此,对它的认证模式进行了改进,形成一种新的加密方式,叫做数字签名。
数字签名
数字签名和认证模式很相似,只不过加入了散列算法。步骤如下
1.发送方对消息进行散列运算,得到原始消息摘要。
2.发送方使用自己的私钥对消息摘要进行加密,该过程也叫作签名。
3.接收方使用发送方的公钥对收到的消息进行解密,得到摘要。
4.接收方对消息进行散列运算,得到本地摘要。
5.判断发送方的摘要和本地摘要是否相等,以判断消息是否被篡改。
数字签名同时满足了完整性和可认证性。但是没有对消息本身进行加密,第三方如果截获消息,就能看到消息的内容。如果传递的是保密性不高的非敏感数据,那么数字签名将是非常好的选择。
综合实现
发送方步骤
1.将消息进行散列运算,得到消息摘要。
2.使用发送方的私钥对消息摘要加密(认证模式,确保了接收方能够确认自己)
3.使用接收方的公钥对消息进行加密(加密模式,确保了消息只能由期望的接收方解密)
4.发送消息和消息摘要
接收方步骤
1.使用发送方的公钥对消息摘要进行解密(认证模式:确认消息是由谁发送的),获取原始消息摘要
2.使用自己的私钥对消息进行解密(加密模式:安全地获得消息内容)
3.将消息进行散列运算,获取本地消息摘要。
4.将原始消息摘要和本地消息摘要进行对比,确认消息是否被篡改。
可以看到,通过上面的方式,综合使用了接收方,发送方全部的四个密钥,再配合使用散列算法,是的前面提出的三个安全条件都满足了。但是非对称加密算法是一种相对耗时的操作,这个方案对于大数据来说是低效的。但是实际上,可以通过它来解决对称加密中的密钥传递问题,也就是说,密钥传递使用这种综合的方式来加密,之后采用对称加密,因为现在这样已经安全了。
证书机制
与数字签名相关的一个概念就是证书机制,证书用来做什么呢?在上面的各种模式中,一直存在这样的一个假设:就是接收方或发送方所持有的,对方的公钥总是正确的。可实际上除非对方当面交接公钥,否则在传递公钥的时候,一样有可能被篡改。那怎么解决这个问题呢?这是就需要证书机制了:可以引入一个公正的第三方机构,当某一方想要发布公钥时,它将自身的身份信息及公钥提交给第三方,第三方对其身份进行证实,如果没有问题,则将其信息和公钥打包成证书。当需要获取公钥时,只需要获取其证书,就可以从中提取出公钥了。