对称加密、非对称加密及数字证书

对称加密、非对称加密及数字证书

对称加密

对称加密算法是指加密和解密过程使用同一个密钥的算法,或者加密密钥可以由解密密钥计算得到(反过来也一样,解密密钥也可以由加密密钥计算得到),对称加密算法计算量小,因此效率更高,但它的缺点是密钥的管理困难,特别是当需要进行数据传输的参与者很多的时候,密钥的管理将是一个噩梦.

非对称加密

顾名思义,非对称加密就是指加密和解密过程使用的不是同一个密钥的算法. 因此,非对称加密的密钥都是以密钥对的形式出现的,发送给别人的密钥称为是公钥(public key), 自己保留的密钥称为是私钥(private key). 根据加密时使用的密钥的不同可以将非对称加密的使用场景分为两种:

  1. 加密传输: 如果A想将消息发送给B,但不想被其它人看到,那么A可以使用B的公钥对这段消息进行加密,因为只有B持有他自己的私钥,因此这段被加密过的密文只能由B通过它的私钥解密得到,保证了消息只能由B看到

  2. 签名:所谓签名的意思就是某个人声称这段消息是由他发出的,比如说,如果A想向B发送一封邮件,同时他想表明这封邮件是由他发出的,那么A就可以使用他的私钥对这封邮件的内容进行签名,然后将这段密文发给B,B用A的公钥对这段密文进行解密,如果解密成功,说明这封邮件确实是由A发出的. 当然,由于非对称加密算法的效率不高,对一大段内容进行加密可能需要花费比较多的时间,因此在实际的操作中,会先对这段内容通过摘要算法计算得到相应的摘要,再用私钥对这个摘要信息进行加密,从而形成签名,这也是数字签名中实现的内容.

数字签名

在通过网络传输信息时,首先使用哈希算法计算得到明文信息的摘要(digest), 然后使用私钥对这段摘要进行加密,并把这段密文和要传输的明文信息一起传输给接收者,这个过程就称为数字签名. 从签名的过程可以看出,它主要包括两个步骤:

  1. 计算明文信息的摘要

  2. 使用私钥对摘要进行加密

当接收者收到相应的内容和签名信息时,他要做的就是验证签名,首先利用相同的摘要算法对明文信息计算得到摘要信息,再用发送者的公钥解密签名信息得到另一个摘要信息,比较计算得到和解密得到的摘要信息是否一致,以此判断这个签名是由发送者签注的。整个验签的过程也分为三个过程:

  1. 计算明文信息的摘要信息

  2. 使用公钥对接收内容中的签名进行解密

  3. 比较步骤1和2中的摘要信息是否一致

数字证书

数字签名解决了消息来源的可靠性问题,但这基于一个前提,就是消息的接收者所持有的公钥确实是属于消息发送者的,如果这个公钥在不知情的情况下被替换了,那么还是存在收到冒充者发送的消息的可能性. 数字证书就是用于解决这个问题的. 现在面临的问题是接收者无法确定自己持有的公钥是否真的来自发送者,数字证书的解决方法就是引入可信任的第三方,首先这个第三方必须是可信任的,再由这个可信任的第三方为发送者的公钥做“担保”,那么这个公钥就是可信任的. 具体的步骤是这样的:

  1. 消息发送者将公钥及其它的信息发送给可信任的第三方(CA)

  2. CA组织在进行必须的校验后,对发送者给它的消息及公钥进行数字签名,形成数字证书颁发给发送者

  3. 发送者将数字证书发给接收者

  4. 接收者拿到数字证书后,首先对CA的数字签名进行验签,验签通过后就可以获取到发送者的公钥,这里的公钥就可以认为是由CA组织担保过的,是可信任的

那么问题来了,接收者怎么确定数字证书中的签名所使用的公钥就是可信任的呢?这里就引入了“证书链”的概念,按照上述的思路一步步地进行上溯,直到找到根证书. 根证书就是自签名或者根本没有签名的证书,安装某个根证书就意味着信任来自这个根证书,也就意味着信息由这个根证书签名过的所有证书. 在实际的操作中,浏览器通常会和某些根证书组织合作,安装浏览器的时候会自动安装这些根证书.

HTTPS

理解了对称加密、非对称加密以及数字证书的机理后,再来看HTTPS就比较简单了.

简单来讲,HTTPS就是在应用层和传输层之间加了SSL/TLS层,在服务端和客户端建立会话前,必须先建立安全通道,之后两者之间所有的数据传输都必须通过这个安全通道来进行. 在建立会话时,服务端和客户端通过非对称加密算法协商密钥,协商完密钥后,后续所有的数据传输都使用这个密钥通过对称加密完成.

整个过程被称为“四次握手”,如下所述:

  1. 客户端向服务端发送client_random以及客户端支持的对称加密算法列表

  2. 服务端收到客户端的请求后,向客户端发送server_random,选定的对称加密算法,以及服务端的数字证书

  3. 客户端首先验证数字证书的真实性,验证通过后,就使用数字证书中的公钥对premaster_num(客户端随机产生)进行加密传输

  4. 服务端收到加密的消息后,使用私钥进行解密,得到客户端传来的premaster_num, 并通过client_random, server_random和premaster_num计算得到对称加密中要使用的密钥,到这里为止,服务端和客户端完成了密钥的协商. 在后续的数据传输中,服务端都将使用步骤2中的对称加密算法,以及步骤4中计算得到的密钥对要传输的数据进行加密

  5. 客户端同样可以根据client_random, server_random以及premaster_num计算得到对称加密算法的密钥,并用它对服务端发来的加密数据进行解密,并在发送数据给服务端前进行加密

可以看到,在密钥协商的过程中,使用的是非对称加密的方法,最大限度地保证了密钥的随机性和保密性,而在数据传输的时候,使用的是则是对称加密,可以有效地提高加密解密的效率

参考文献

您的支持将鼓励我继续创作!