HTTPS = HTTP + SSL,HTTP是明文传输的,所以HTTPS 需要使用加密算法建立安全连接.
知乎链接
1、服务器端有公钥和私钥A、A’,客户端通过HTTP与服务器进行连接,服务器将自己的公钥发送给客户端,客户端收到后使用A加密一个客户端随机生成的加密算法X,得到X’,将X’发送给服务器,服务器使用自己的私钥解密X’,得到客户端和服务器端都一致的加密算法X,之后使用对称加密算法X进行数据传输。
2、上述过程中发送A的时候可能会出现中间人攻击,中间人有公钥B、B’,他将服务器发送给客户端的数据包截获,将里面的公钥A换成自己的公钥B,然后发送给客户端,客户端使用他认为的公钥A加密X,将X’发送回去,中间人再次截获X’,使用自己的私钥B解密得到X,然后使用公钥A加密X得到X’’,将X’’发送给服务器,服务器使用私钥A解密X’’得到X,此时服务器和客户端都未发觉X已经被泄露,这时的通信就是不安全的。
3、接下来就要解决公钥A能准确到达客户端的问题就能实现安全的连接了。此时CA机构出场,CA机构是一个绝对安全,值得信任的组织,如果不信任就继续不下去了。他有自己的公私钥C、C’,服务器选择这个CA机构给自己颁发一个数字证书,证书里面有明文、数字签名、加密函数hash,服务器的域名等信息,其中明文代表服务器的公钥A,数字签名=公钥A+hash函数+私钥C’加密,客户端收到服务器发送给他的数字证书后,根据这个证书的信息得到颁发机构CA,从系统中找到这个CA的公钥,通过比较使用公钥C解密的数字签名的值(公钥C存在每个客户端中,出厂自带的,或者自行安装(不安全)是根证书里的明文,根证书就是CA给自己颁发的数字证书,)和使用证书里的hash函数加密的公钥A的值是否相等就可以确认证书是否是安全的,就拿到了正确的公钥A,否则就认为这个明文是被修改过的,因为私钥C’只有CA机构才有,所以没有别人可以得到修改了明文之后的对应的数字签名。这里使用hash函数的目的第一是性能问题,非对称加密过程较为费时,使用hash算法后得到的值是固定长度,之后的加解密会快很多,第二是更安全.
4、显然每次请求都经历一次密钥传输过程非常耗时,那怎么达到只传输一次呢?用session就行。服务器会为每个浏览器(或客户端软件)维护一个session ID,在TSL握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了!
HTTPS加密
最新推荐文章于 2021-05-18 18:35:27 发布