你在咖啡馆刚登录一个网站,结果密码被人看光了。同一个公共无线网里的人,真的能看到你的密码吗?
答案取决于这个网站有没有用 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
-
web.dev:Why HTTPS matters,未加密连接可被窃听和篡改,HTTPS 保护的范围。 ↩ ↩2
-
MDN:HTTPS;RFC 9110:HTTP Semantics,IETF,2022-06,https 网址方案与安全连接要求。 ↩
-
MDN:Transport Layer Security,TLS 在网页中的作用。 ↩
-
MDN:Symmetric-key cryptography,对称加密用同一把钥匙加密和解密。 ↩
-
RFC 8446:The Transport Layer Security (TLS) Protocol Version 1.3,IETF,2018-08,临时密钥交换、证书与签名验证(CertificateVerify)、一次往返的完整握手、带校验的加密记录。 ↩ ↩2 ↩3 ↩4
-
RFC 7748:Elliptic Curves for Security,IETF,2016-01,X25519 密钥交换:双方用各自秘密和对方公开值算出相同结果。 ↩
-
Firefox 开发者工具:Network request details,「安全性」与「时间」标签中的 TLS 信息。 ↩ ↩2
-
RFC 5280:Internet X.509 Public Key Infrastructure Certificate and CRL Profile,IETF,2008-05,证书字段、有效期与证书路径校验。 ↩
-
MDN:Certificate authority;Mozilla 支持:How do I tell if my connection to a website is secure?,地址栏小锁与查看证书。 ↩
-
MDN:Digital certificate,证书把公开数据与身份绑定,由机构签名。 ↩
-
MDN:Digital signature,数字签名用于发现内容被改动、确认签名者。 ↩
-
Let’s Encrypt:FAQ,证书只验证对域名的控制权,不判断网站是否在做钓鱼或诈骗。 ↩
-
CISA:Recognize and Report Phishing,识别钓鱼页面与催促话术。 ↩
幕后
这部片子完全由代码生成。
系列 · 请求链路第 2/7 期