签名、加密、证书的基本原理和理解
最近开始接触后端PHP开发,里面涉及到的签名、加密、证书等概念弄得自己头晕眼花,最近查看了相关资料,下面把自己的理解写下来,有不对的地方,还请多指点指点。
数据传输安全的要满足的要求:
- 消息的发送方能够确定消息只有预期的接收方可以解密(不保证第三方无法获得,但保证第三方无法解密)。
- 消息的接收方可以确定消息是由谁发送的(消息的接收方可以确定消息的发送方)。
- 消息的接收方可以确定消息在途中没有被篡改过(必须确认消息的完整性)。
对称加密
网络的数据传输从发送方发出到接收方接收到,要经过数个节点才能到达目的地,在这个过程中难免会被别有用心的人监听(现在常用的网络数据监听软件就有charles,具体可以查看相关使用教程,通过这个软件可以监听到某个页面用到了哪些接口,发送以及返回的参数分别是什么)。所以在传输敏感数据的过程中,就要对数据进行加密。现行的加密过程中,一般加密算法是公开的,密钥是自己持有,发送方有密钥对数据进行加密传输,在传输的过程中经过加密的数据即使被第三方窃取到也因为没有密钥不能解密。而接收方同样持有密钥通过算法的逆运算把密文解析出对应的明文来。
过程如下:
上述算法即为对称加密,特点是加密和解密都是用同一个密钥。这种算法的前提条件是发送方和接收方用一个密钥,也就是说在数据传输之前,接收方要知道发送方用于发送加密数据所用到的密钥。但是现实条件是一般不会把密钥手把手的交给对方,所以下面就要用到非对称加密算法。
非对称加密算法
非对称加密算法中信息的发送方和接收方都分别有两个密钥,其中分别为私钥和公钥,私钥为数据的发送方持有,公钥可以公开。其中涉及到两种模式,它们分别为加密模式和认证模式。
加密模式:
发送方用公钥给数据进行加密,然后把加密后的数据发送到接收方,然后接收方用对应的私钥解密,因为只有接收方的私钥才能解析数据,所以即使被第三方窃取到数据也没有关系。这个模式叫做加密模式。在这个过程中如何保证数据的完整性,保证数据是发送方发送的数据,而不是被第三方篡改后的数据。这时就要用到签名,在发送方加密明文之前,给明文取md5值,得到其信息的摘要(注:不能通过信息摘要反推明文)。然后用公钥分别给明文和明文的摘要加密发送到数据的接收方,数据的接收方接收到数据之后,用私钥对密文和摘要进行解密,然后对解密得到的明文取md5摘要,比对解密后的明文摘要和发送过来的摘要是否一致;一致就证明数据是原始的数据没有遭到篡改。这个加密的过程中保证了数据的安全性(即只有接收方才可以解密)和防篡改性(签名认证),这就保证了上面说的数据传输要求中的第一点和第三点。下面是图解过程:
但是因为公钥是公开的,所以在加密模式中我们是不知道到底是谁发送数据给我们的,因此下面就要提到认证模式。
认证模式:
在认证模式中,发送方用私钥加密数据,给接收方发送数据,接收方用公钥解密,因为私钥是唯一的,所以只要数据解析成功就可以知道数据发送方是谁。
这就附和我们在数据的传输要求中的第二点了。下面是图解过程:
结合加密模式和认证模式就可以实现数据传输安全的三大要点了。
下面我们来解释一下这种高级模式,以发送方和接收方两个部分来解释:
- 将消息进行散列运算,得到消息摘要。
- 使用自己的私钥对消息摘要加密(认证模式:确保了接收方能够确认自己)。
- 使用接收方的公钥对消息进行加密(加密模式:确保了消息只能由期望的接收方解密)。
- 发送消息和消息摘要。
接下来我们看一下接收方所执行的步骤:
- 使用发送方的公钥对消息摘要进行解密(确认了消息是由谁发送的)。
- 使用自己的私钥对消息进行解密(安全地获得了实际应获得的信息)。
- 将消息进行散列运算,获得消息摘要。
- 将上一步获得的消息摘要 和 第一步解密的消息摘要进行对比(确认了消息是否被篡改)。
可以看到,通过上面这种方式,使用了接收方、发送方全部的四个密钥,再配合使用消息摘要,使得前面提出的安全传递的所有三个条件全都满足了。那么是不是这种方法就是最好的呢?不是的,因为我们已经说过了,非对称加密是一种很耗时的操作,所以这个方案是很低效的。实际上,我们可以通过它来解决对称加密中的密钥传递问题,如果你已经忘记了可以翻到前面再看一看,也就是说,我们可以使用这里的高级实现方式来进行对称加密中密钥的传递,对于之后实际的数据传递,采用对称加密方式来完成,因为此时已经是安全的了。
证书机制
与数字签名相关的一个概念就是证书机制了,证书是用来做什么呢?在上面的各种模式中,我们一直使用了这样一个假设,就是接收方或者发送方所持有的、对方的公钥总是正确的(确实是对方公布的)。而实际上除非对方手把手将公钥交给我们,否则如果不采取措施,双方在网络中传递公钥时,一样有可能被篡改。那么怎样解决这个问题呢?这时就需要证书机制了:可以引入一个公正的第三方,当某一方想要发布公钥时,它将自身的身份信息及公钥提交给这个第三方,第三方对其身份进行证实,如果没有问题,则将其信息和公钥打包成为证书(Certificate)。而这个公正的第三方,就是常说的证书颁发机构(Certificate Authority)。当我们需要获取公钥时,只需要获得其证书,然后从中提取出公钥就可以了。