HTTPS 详述

HTTPS是什么

HTTPS(HyperText Transfer Protocol Secure)超文本传输安全协议,数据通信仍然是HTTP,但利用SSL/TLS加密数据包。

工作流程

  1. 用户在浏览器发起HTTPS请求(如 https://www.mogu.com/),默认使用服务端的443端口进行连接;
  2. HTTPS需要使用一套CA数字证书,证书内会附带一个公钥Pub,而与之对应的私钥Private保留在服务端不公开;
  3. 服务端收到请求,返回配置好的包含公钥Pub的证书给客户端;
  4. 客户端收到证书,校验合法性,主要包括是否在有效期内、证书的域名与请求的域名是否匹配,上一级证书是否有效(递归判断,直到判断到系统内置或浏览器配置好的根证书),如果不通过,则显示HTTPS警告信息,如果通过则继续;
  5. 客户端生成一个用于对称加密的随机Key,并用证书内的公钥Pub进行加密,发送给服务端;
  6. 服务端收到随机Key的密文,使用与公钥Pub配对的私钥Private进行解密,得到客户端真正想发送的随机Key;
  7. 服务端使用客户端发送过来的随机Key对要传输的HTTP数据进行对称加密,将密文返回客户端;
  8. 客户端使用随机Key对称解密密文,得到HTTP数据明文;
  9. 后续HTTPS请求使用之前交换好的随机Key进行对称加解密。

对称加密与非对称加密

对称加密是指有一个密钥,用它可以对一段明文加密,加密之后也只能用这个密钥来解密得到明文。如果通信双方都持有密钥,且天知地知你知我知,绝对不会有别的人知道,那么通信安全自然是可以得到保证的(在密钥足够强的情况下)。

然而,在HTTPS的传输场景下,服务端事先并不知道客户端是谁,你也不可能在事先不通过互联网和每一个网站的管理员都悄悄商量好一个通信密钥出来,那么必然存在一个密钥在互联网上传输的过程,如果在传输过程中被别人监听到了,那么后续的所有加密都是无用功。

这时,我们就需要另一种神奇的加密类型,非对称加密。

非对称加密有两个密钥,一个是公钥,另一个是私钥。一般来说,公钥用来加密,这时密文只能用私钥才能解开。

那么,当客户端发起连接请求,服务端将公钥传输过去,客户端利用公钥加密好信息,再将密文发送给服务端,服务端里有私钥可以解密。

但是,当服务端要返回数据,如果用公钥加密,那么客户端并没有私钥用来解密,而如果用私钥加密,客户端虽然有公钥可以解密,但这个公钥之前就在互联网上传输过,很有可能已经有人拿到,并不安全,所以这一过程只用非对称加密是不能满足的。

注:非对称加解密耗时要远大于对称加解密,对性能有很大损耗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A*算法是一种启发式搜索算法,可以用于解决最短路径问题。它以启发式函数为辅助,通过评估每个节点到目标节点的距离来指导搜索方向,从而提高搜索效率。以下是A*算法的具体原理。 1. 初始化:将起始点加入开放列表,并将其估计值(启发式函数)f设为0。 2. 搜索过程:从开放列表中选取f值最小的节点进行扩展。将该节点从开放列表中删除,并将其加入到关闭列表中。对于该节点的相邻节点,如果相邻节点不在关闭列表中,则将其加入开放列表,并计算它的f值(启发式函数),同时记录该节点的父节点。 3. 判断终点:重复执行第2步,直到终点被加入到关闭列表中或者开放列表为空。 4. 搜索成功:如果终点被加入到关闭列表中,搜索成功,通过回溯每个节点的父节点,得到从起始点到终点的最短路径。 以下是A*算法的伪代码: ``` 1. Put the starting node s on a list called the open list. 2. Set the f-value of s to 0. 3. 4. while the open list is not empty: 5. Select the node n with the lowest f-value from the open list. 6. Remove n from the open list and add it to the closed list. 7. if n is the goal node: 8. return the path from s to n. 9. 10. for each successor of n: 11. if successor is not in the closed list: 12. if successor is not in the open list: 13. add successor to the open list. 14. set the f-value of successor to f(n) + g(n, successor). 15. set the parent of successor to n. 16. else if the f-value of n + g(n, successor) is less than the f-value of successor: 17. update the f-value of successor to f(n) + g(n, successor). 18. set the parent of successor to n. 19. 20. return "no path exists". ``` 其中,f(n)表示节点n的估价函数值,g(n, successor)表示从节点n到successor的实际代价。 以下是一个简单的例子,说明如何使用A*算法找到从源节点s到目标节点t的最短路径。 假设有以下有向图: ![A*算法示例图](https://i.imgur.com/w0YBmJj.png) 我们要找到从源节点s到目标节点t的最短路径。 1. 初始化:将起始节点s加入到开放列表,将f(s)设为0。 2. 第一轮扩展:从开放列表中选取f值最小的节点s进行扩展。将s从开放列表中删除,并将其加入到关闭列表中。对于s的相邻节点a和b,计算它们的f值,并记录它们的父节点为s,并将它们加入到开放列表中。 ``` f(a) = g(s, a) + h(a, t) = 3 + 2 = 5 f(b) = g(s, b) + h(b, t) = 2 + 4 = 6 ``` 此时开放列表为[a, b],关闭列表为[s]。 3. 第二轮扩展:从开放列表中选取f值最小的节点a进行扩展。将a从开放列表中删除,并将其加入到关闭列表中。对于a的相邻节点c和d,计算它们的f值,并记录它们的父节点为a,并将它们加入到开放列表中。 ``` f(c) = g(a, c) + h(c, t) = 1 + 3 = 4 f(d) = g(a, d) + h(d, t) = 3 + 2 = 5 ``` 此时开放列表为[b, c, d],关闭列表为[s, a]。 4. 第三轮扩展:从开放列表中选取f值最小的节点c进行扩展。将c从开放列表中删除,并将其加入到关闭列表中。对于c的相邻节点t,计算它的f值,并记录它的父节点为c,并将其加入到开放列表中。 ``` f(t) = g(c, t) + h(t, t) = 2 + 0 = 2 ``` 此时开放列表为[b, d, t],关闭列表为[s, a, c]。 5. 第四轮扩展:从开放列表中选取f值最小的节点t进行扩展。将t从开放列表中删除,并将其加入到关闭列表中。搜索成功,通过回溯每个节点的父节点,得到从起始点s到目标节点t的最短路径为s->a->d->t。 6. 搜索成功,得到最短路径为s->a->d->t。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值