对称加密和非对称加密

前言

对称加密与非对称加密小记。

对称加密

对称加密即通信双方使用同一个密钥来对消息进行加密与解密。

过程:客户端A向服务端B首次发起请求时,服务端B先返回一个公共密钥给客户端A,客户端A将信息使用该密钥加密后在发送给服务端B,服务端接收到加密的信息后,再使用公钥进行解密,从而拿到客户端A的消息。

缺点:1.密钥的数目难以管理。当请求逐渐变多,服务端需要不断生成不同的密钥发送给客户端,密钥的数量越来越来庞大也就变得越来越难以管理和维护;如果不针对每一个客户端都生成不同的密钥那么又毫无安全可言了。

2.由于密钥是通过网络传输的,且加密解密都用的同一把密钥。此种情况下如果密钥在传输的过程中被C劫持,那么C拿着这个密钥就可以给A或B发送加密信息,且A和B是难以确定C的身份的。

非对称加密

非对称加密即通信双方使用两把密钥来对消息进行加密解密。公钥加密的内容需要用私钥进行解密,私钥加密的内容需要用公钥进行解密。

过程:服务端拥有两把密钥,私钥k1和公钥k2。当客户端A向服务端B发起请求的时候,服务端B将公钥通过网络先传输给客户端A,客户端将要发送的信息使用公钥进行加密后发送给服务端,服务端再根据私钥对信息进行解密,就拿到了信息的内容,从而保证了客户端向服务端发送信息的安全性。但是无法保证服务端向客户端发送消息的安全性,因为公钥仍然是通过网络传输还是可能被盗取。

缺点:效率较低。

对称加密和非对称加密的组合使用

由于对称加密效率高,非对称加密安全性高,所以这两种加密算法通常一起使用。

方法:先使用非对称密钥对对称密钥进行加密,然后通过对称密钥加密实际请求的内容。

过程:第一次通信的时候,服务端发送公钥给客户端,客户端生成一个对称密钥,通过服务端的公钥加密后发送给服务端,服务端使用私钥解密后可以得到这个对称密钥。后续的交互中都通过对称密钥进行加密传输。

仍然存在的不安全

上述对称加密和非对称加密的组合使用看似天衣无缝,实则还是存在中间人攻击的行为。

场景:在A和B进行通信的时候,C伪装成服务端截取公钥。

过程:客户端A首次发送请求给服务端B想要获取公钥,此时C伪装成为服务端,截取了A的请求并转发给服务端B,此时服务端B以为这个请求是A发送来的,于是返回了公钥,C拿到公钥后交还给A一个错误的信息作为公钥,此时A也是不知道的,A使用C给的公钥进行对称密钥的加密发送给C,并且进行后续的通信,C成功伪装并截取信息。

数字证书

那么在协商密钥的过程中,客户端怎么才能确定对方是真正的目标服务器呢?怎么证明服务器的身份呢?先来了解一下数字证书。

服务器为了能够证明自己就是服务器,往往通过证书的方式来证明自己。客户端与服务端在进行第一次通信的时候,服务器需要出示自己的数字证书,证明自己的身份以及公钥。而颁发证书的机构肯定是权威的机构,CA机构就是颁发证书的权威机构,他专门用来颁发证书以及验证证书的合法性。

客户端在拿到服务器的证书后,就可以通过编号在CA机构进行证书的查询,核对证书的基本信息如当前域名是否和证书上的域名一直,还可以拿到证书中服务器的公钥信息用于协商对称密钥。

可证书颁发了,怎么证明证书就是真的证书呢,万一在传输的过程中证书被拦截,公钥被篡改,那不是依然无法保证安全?

数字签名

在签合同的时候,往往需要通过盖章、签字等手段来保证合同的真实性。数字证书也是同样的道理。他也需要一个数字签名。

番外话:我们在做权限系统的时候,存储用户密码的时候都会经过md5计算摘要后存储,在登录的时候计算用户密码的md5摘要和数据库中存储的摘要进行对比,如果一致则密码正确。MD5是不可逆的,且不同的数据计算出来的摘要是不一样的(也有极小的概率发生hash碰撞)。基于这个思路便有了数字签名。

数字签名:服务器要想获得自己的数字证书,首先要向CA机构提出申请,CA机构在给服务器颁发证书的时候,会连同数字证书以及根据数字证书计算的摘要一同发给服务器,且这个摘要是需要经过CA机构自己的私钥进行加密的。整个申请过程如下图所示:

服务端在与客户端进行通信的时候,就会将数字证书和数字签名一同出示给客户端了。客户端拿到数字证书和数字签名之后,先通过操作系统或浏览器内置信任的CA机构找到对应的公钥对数字签名进行解密,然后使用相同的摘要算法计算数字证书的摘要,如果自己计算的摘要与服务器发来的摘要一致,则证书是没有被篡改过的。这样就防止了证书的篡改。第三方拿不到CA机构的私钥,也就无法对摘要进行加密。如果是第三方伪造的签名在客户端也无法使用正确公钥解密,这也就防止了伪造。所以数字签名就是通过这种机制来保证数字证书被篡改和伪造的。

注意:这里有两个公钥: 一个是CA的公钥,内置在客户端(操作系统或浏览器),用来解密数字签名的。另一个是目标服务器的公钥(来自服务器),存在于数字证书当中,是用来协商对称密钥的

HTTPS

HTTPS就是HTTP+SSL,在HTTP层和TC层之间加了一个SSL/TLS层。

SSL又叫做“安全套接层”,后来由于广泛应用,SSL标准化之后就改名叫作TLS了,HTTPS其实就是通过上述内容所述方法来解决网络上可能存在的数据泄露,篡改等问题,保证网络的安全传输的。