HTTPS 为什么安全?

发布 · 更新于 · 视频 2:46 · 约 6 分钟读完 · #网络基础#HTTPS

你在咖啡馆刚登录一个网站,结果密码被人看光了。同一个公共无线网里的人,真的能看到你的密码吗?

答案取决于这个网站有没有用 HTTPS。下面跟着一次登录,从头走一遍:密码为什么会泄露,HTTPS 怎么让路上的人看不懂,钥匙从哪儿来,浏览器怎么确认对面是真网站,以及地址栏那把小锁管不了什么。

跟着一次登录走一遍

1. 密码为什么会泄露#▶ 从这里看

登录框里的圆点,只是不让旁边的人从屏幕上看到密码。密码真正发出去时是什么样,要看网页用的是什么方式通信。

假如这个网站没上 HTTPS,用的就是不加密的 HTTP。HTTP 是浏览器和网站之间收发网页的规则;不加密时,数据在路上就是原文。控制咖啡馆热点、或者能截获这段网络流量的人,可以直接读到你提交的账号和密码。1

他还能做得更多:把你收到的页面改掉,比如换掉收款码,或者直接塞给你一张假的登录页。

所以要同时防三件事:防偷看、防偷改,还要认准网站。第一步,先让路上的人看不懂。

2. 先让路上的人看不懂#▶ 从这里看

HTTPS 就是在 HTTP 外面加一层安全保护,这层保护叫 TLS。换成 HTTPS 后,你发出的密码在路上变成只有你和网站能还原的乱码;抓包的人能看到有数据经过,却读不出内容。23

真正给大量数据加密的,是对称加密:两边用同一串秘密数字当钥匙,一个负责加密,一个负责解密。它速度快,网页里的图片、视频也能大量传输。4

难题在钥匙本身:你和网站从没见过,哪来同一把钥匙?要是直接把钥匙发过去,控制热点的人一样能截到。

3. 钥匙不传,各自算出来#▶ 从这里看

HTTPS 的办法是:钥匙根本不在网上传。

以现在常用的 TLS 1.3 为例,浏览器和网站每次连接都各自临时生成一个秘密,只把由它算出来的公开部分发给对方。双方再用「自己的秘密 + 对方的公开部分」各自计算,就能得到同一个结果,并由它生成这次通信要用的钥匙。路上的人只看到公开部分,缺少任何一方的秘密,算不出钥匙。56

在浏览器开发者工具里打开一个 HTTPS 请求的安全信息,可以看到这次连接用的协议版本和密钥交换方式。7

钥匙是保住了。可如果跟你交换数据的那一头,本来就是冒牌网站呢?

4. 对面究竟是谁#▶ 从这里看

所以浏览器还要检查证书。证书是一份电子证明,写着它属于哪个网址,以及用来核对网站身份的公开数据。

浏览器会核对:证书上的网址和你访问的是否一致,是否还在有效期内,然后顺着签发关系一级级往上,直到查到自己信任的证书机构(CA),才接受这份证书。89

证书本身由受信任的机构签过名。签名是用机构保管的秘密生成的一串数据,证书里哪怕改动一个字,签名就对不上。1011

光有证书还不够,因为证书是公开的,谁都能抄一份。网站还得在这次连接里当场证明「这次通信是我自己」:它用只有自己保管的私钥,对这次握手的内容签名,浏览器用证书里的公开数据核对。冒牌货只抄到证书,拿不出私钥,做不到,连接就断了。5

那这些检查要等多久?

5. 这些准备要等多久#▶ 从这里看

上面这一整套——商量加密办法、各自算出钥匙、核对证书和身份——合起来叫 TLS 握手。

现在常见的 TLS 1.3,完整握手一个来回就做完了:浏览器先发出自己的公开部分和支持的加密办法,网站回复自己的公开部分,再把证书和签名加密发过来。之后浏览器就可以发送加密后的请求。5

在开发者工具的「时间」信息里,可以看到建立连接时 TLS 握手用了多久。7

可路上有人动手脚呢?

6. 路上被改了怎么办#▶ 从这里看

TLS 1.3 加密时,每条记录还会带上校验数据。接收方用同一套钥匙解密并检查,内容哪怕只改了一点,校验就通不过,这条数据会被直接拒收,连接也会中断。5

所以 HTTPS 同时做到了三件事:加密防偷看,证书防冒充,校验防篡改。

可有锁就放心吗?

7. 有锁就能放心吗#▶ 从这里看

骗你交密码的钓鱼网站,也能有小锁。钓鱼网站同样可以申请到有效证书,它证明的只是「你连上的就是这个网址」,而不是「这个网址背后的人可靠」。12

小锁只说明连接加密了,不说明网站可信,要看清网址。遇到催你「立即验证账号」的页面,先核对完整网址,或者从自己保存的官方入口重新进入。13

HTTPS 也只保护传输过程。数据到了网站那边怎么处理,或者你自己的设备上装了什么软件,都不在它的保护范围内。1

想一想

你判断登录页能不能信,还会看什么?

下期讲 DNS:输入网址后怎么找到服务器。关注我,觉得有用就点赞、收藏

参考资料

Footnotes

  1. web.dev:Why HTTPS matters,未加密连接可被窃听和篡改,HTTPS 保护的范围。 ↩ ↩2

  2. MDN:HTTPS;RFC 9110:HTTP Semantics,IETF,2022-06,https 网址方案与安全连接要求。 ↩

  3. MDN:Transport Layer Security,TLS 在网页中的作用。 ↩

  4. MDN:Symmetric-key cryptography,对称加密用同一把钥匙加密和解密。 ↩

  5. RFC 8446:The Transport Layer Security (TLS) Protocol Version 1.3,IETF,2018-08,临时密钥交换、证书与签名验证(CertificateVerify)、一次往返的完整握手、带校验的加密记录。 ↩ ↩2 ↩3 ↩4

  6. RFC 7748:Elliptic Curves for Security,IETF,2016-01,X25519 密钥交换:双方用各自秘密和对方公开值算出相同结果。 ↩

  7. Firefox 开发者工具:Network request details,「安全性」与「时间」标签中的 TLS 信息。 ↩ ↩2

  8. RFC 5280:Internet X.509 Public Key Infrastructure Certificate and CRL Profile,IETF,2008-05,证书字段、有效期与证书路径校验。 ↩

  9. MDN:Certificate authority;Mozilla 支持:How do I tell if my connection to a website is secure?,地址栏小锁与查看证书。 ↩

  10. MDN:Digital certificate,证书把公开数据与身份绑定,由机构签名。 ↩

  11. MDN:Digital signature,数字签名用于发现内容被改动、确认签名者。 ↩

  12. Let’s Encrypt:FAQ,证书只验证对域名的控制权,不判断网站是否在做钓鱼或诈骗。 ↩

  13. CISA:Recognize and Report Phishing,识别钓鱼页面与催促话术。 ↩

幕后

这部片子完全由代码生成。