你有没有想过,当你在深夜访问XXXHub网站的时候,你电脑/手机发出的网络数据包被人在网络中间某个节点捕获,从而知道了你访问了XXXHub。
你可能会说,现在都是HTTPS了,上网内容都加了密了,别人看不到的。
但你可能不知道的是,即便是使用了HTTPS,但也只是加密了传输内容,但你是在浏览哪个网站,依然能被人知道。
这里面有两个途径可以知道你是在访问什么网站。
方法1:DNS
在正式访问网站之前,一般会有一个域名解析的过程,把XXXHub的域名转换为IP地址,才能进行后续的通信,而这个过程一般是不会加密的。所以当看到你有请求XXXHub的DNS行为,就知道你接下来要浏览这个网站了。
为了躲避通过DNS发现上网行为,目前已经有两套比较成熟的方案,分别是DNS over TLS(简称DoT)以及DNS over HTTPS(简称DoH)。
DoT类似于HTTPS,把DNS解析的过程从原来的UDP明文传输变成基于TCP的TLS连接中进行,从而隐藏DNS请求和响应内容。
DoH就更好理解了,直接把域名解析的操作,通过HTTPS来进行,都不走传统的DNS报文,而是用GET/POST获取到结果。
关于上面两项技术,详情可以参考RFC最新的文档:
DoT: https://datatracker.ietf.org/doc/html/rfc7858 DoH: https://datatracker.ietf.org/doc/html/rfc8484
方法2:HTTPS的SNI
DNS可能很多人知道,但这个SNI知道的人可能就不多了。
HTTPS,实际上就是HTTP TLS/SSL,在进行HTTP超文本传输之前,会有一个TLS/SSL握手的过程,用于交换秘钥加密后续的内容。
而就在这个握手的阶段,将会暴露你访问的是哪个网站,比如我通过HTTPS访问百度地图,用wireshark抓个包看看:
看到了吧,在TLS握手的第一个包——Client Hello中,你要访问哪个网站就被出卖了!
这个就是SNI,全名Server Name Indication,客户端用它来表达自己想要请求哪个域名。
为什么会有这个字段呢?
想象一下,假设你有a.com和b.com两个域名,分别颁发了A和B两个证书文件,这两个域名都解析到你的同一台云服务器上,IP地址是同一个,这完全是可能的。现在来了一个HTTPS连接,如果没有表明自己要请求的域名,服务器怎么知道该返回哪个证书给浏览器呢?如果证书这一环弄错,通信就无法进行下去。
但就是这么个SNI的家伙,会出卖你要访问的网站信息。
那有没有什么办法,把这个也给藏起来,不让人知道呢?
这就是今天要说的主角:CloudFlare搞了个新技术——Encrypted Client Hello,简称ECH。
看这个英文全称就可以看出,它把TLS握手中的Client Hello消息给加密了!
它是怎么做的呢?
说起来其实也不复杂,它把原来的Client Hello拆成了两部分,一个叫outer SNI,包含不敏感的信息(比如TLS版本号,一个叫inner SNI,包含敏感的信息,比如这里的网站域名。
然后把这样一个请求发送到 cloudflare-ech.com,由它来解密。外界只会看到你在访问 Cloudflare,但不知道你的真正目的地。
听起来有些复杂,实际上跟代理差不多,Cloudflare充当了这个代理角色,你把要访问的网站地址告诉它,它来完成接下来的通信。
我是在IT技术大佬阮一峰的微博看到的这一消息,对于这项技术,评论区看法不一。
有些持怀疑态度:
也有人肯定它的积极作用:
还有一个评论亮了:
这不就相当于那啥吗?
现在,有了DoT/DoH保护你的DNS请求过程,有ECH隐藏你要访问的网站,有HTTPS加密你传输的网页内容,真正做到全程护航,网络中的其他节点理论上再也看不到你上网干了啥了!
注意我说的是网络中的节点,终端上如果被种马了,那还是白搭。
你觉得这个技术怎么样?有实际意义吗?
往期推荐
- 核弹级漏洞!我把log4j扒给你看!
- 可怕!CPU暗藏了这些未公开的指令!
- 我是Redis,MySQL大哥被我害惨了!
- CPU被挖矿,Redis竟是内鬼!
- 主板上来了一个新邻居,CPU慌了!