軟體工程筆記 architecture

傳輸加密怎麼選|HTTPS/TLS、E2EE、P2PE 對照

用生活場景分清三種鎖:網頁的 HTTPS/TLS、聊天的 E2EE、刷卡的 P2PE。先看誰能解密,再決定要疊哪一層。

  • HTTPS
  • TLS
  • E2EE
  • P2PE
  • 資訊安全
  • 加密
傳輸加密怎麼選|HTTPS/TLS、E2EE、P2PE 對照

加密常被講成一種東西。差別幾乎都在:鎖是鎖在哪兩端,以及路上經過的人有沒有鑰匙。

你把退貨單封進包裹,運將拆不開,賣家倉庫卻一定會拆——不然怎麼退貨?這是 HTTPS/TLS:路上安全,對方伺服器本來就要看到內容。

你把信放進鐵盒,只有朋友有鑰匙。超商、轉運中心、快遞總部都只能搬箱子。這是 E2EE。

超商刷卡時,店員螢幕頂多看到卡號末四碼。卡號不是進店家電腦才加密,是進刷卡機就鎖上,只有銀行/支付處理器有鑰匙。這是 P2PE。

這篇只做一件事:分清 HTTPS/TLS、E2EE、P2PE 誰能讀資料,幫你選定要疊哪一層。

這三個不是互斥選項。HTTPS 是地板;E2EE 與 P2PE 是特定場景再加的第二把鎖。WhatsApp 訊息仍走 TLS 連到伺服器,只是內容另外做了 E2EE。

先看對照表

特性HTTPS/TLSE2EEP2PE
生活比喻封好的包裹,賣家倉庫會拆只有收件人有鑰匙的鐵盒刷卡機當場把卡號鎖進保險箱
保護範圍用戶端 ↔ 這台伺服器(或 CDN)發送裝置 ↔ 接收裝置支付終端 ↔ 支付處理器
中間能否讀可以。到站就解密,才能處理登入、下單不行。平台沒有私鑰店家/中間系統通常不行;處理器可以(本來就要授權)
金鑰在誰手上網站,或終止 TLS 的 CDN/反向代理兩端使用者裝置機具與處理器的安全環境,不在店員電腦
常見場景瀏覽網頁、網路銀行登入、呼叫 APISignal、WhatsApp、iMessage實體刷卡、零售支付
主要防的是路上被竊聽、假基地台、咖啡廳 Wi-Fi平台業者、駭入伺服器的人讀內容店家中招、店員側錄、POS 中間人
防不了的網站把資料存成明文、XSS、釣魚手機中木馬、螢幕被看、metadata偽卡、盜刷後的帳戶層問題
與另外兩者所有網站的底線,不能省疊在 TLS 之上疊在支付鏈路上,不是網頁小鎖的替代品

比較時不要問「哪一種比較安全」,問「你希望誰讀不到」。希望路上的人讀不到 → TLS 就夠;希望連你自己的伺服器都讀不到 → 才需要 E2EE;希望連店家後台都看不到卡號 → 才是 P2PE。

明文出現在哪,差就在這裡:

HTTPS/TLS

E2EE

P2PE

三種鎖,三個生活現場

HTTPS/TLS:封好的包裹,倉庫會拆

HTTPS:你把資料封進包裹,路上拆不開,對方伺服器會拆開處理
路上沒人拆得開,但對方伺服器本來就要拆——不然怎麼處理你的登入和下單。

HTTPS/TLS

原理:瀏覽器跟伺服器先確認對方身分(憑證),再談一把會話金鑰,之後 HTTP 內容都加密。這就是網址列的小鎖。TLS 是協定,HTTPS 是跑在 TLS 上的 HTTP。

優點:防路上竊聽與大多數中間人;憑證生態成熟,所有網站、API、App 連後端都該有。

缺點:資料抵達伺服器(或 Cloudflare 這類會終止 TLS 的節點)後就是明文。網站自己能讀,才能驗證密碼、算購物車。

適用:任何會把資料交給「對方那台伺服器」處理的服務。這是預設,不是選配。

E2EE:只有朋友有鑰匙的鐵盒

E2EE:鐵盒只有收件人有鑰匙,中間的平台只能搬密封箱
連快遞總部都沒有鑰匙。平台被抄家、工程師開後台,也讀不到內容。

E2EE

原理:在發送裝置加密,只在接收裝置解密;中間的雲端沒有私鑰。Cloudflare 把這件事定義得很乾脆:只有通訊雙方能讀。

優點:連服務提供者都看不到內容。伺服器外洩時,倒出的多半是密文。

缺點:金鑰管理複雜;客服無法代查訊息;時間、誰跟誰說話等 metadata 通常仍可見。手機中木馬時,傳輸加密幫不上忙。

適用:即時通訊、私密檔案、你不希望自己當「能讀用戶內容的中間人」的產品。

P2PE:刷卡機當場把卡號鎖進保險箱

P2PE:卡號在刷卡機上鎖,店家系統看不到,支付處理器才解開
鎖在刷卡機裡,不是鎖在店家的電腦裡。店員螢幕最多顯示末四碼。

P2PE

原理:支付產業用語(PCI Point-to-Point Encryption):卡號在通過認證的刷卡機內加密,只在支付處理器的安全環境解密。店家 POS、店內網路、總公司伺服器中間這段通常只有密文。Splashtop 也把 P2PE 的兩端寫成支付終端到處理器。

優點:商戶環境中招,也拿不到完整卡號;通過認證的方案可以縮小 PCI DSS 範圍。

缺點:「兩端」是機具與處理器,不是持卡人與商店老闆。處理器當然要能讀,否則無法授權。這點和 E2EE 最容易被寫混。

適用:實體收單、要降低卡號暴露面的零售。一般官網金流導向託管頁,通常不是自建 P2PE。

最容易混的三組詞

HTTPS ≠ E2EE

小鎖只保證「你到這家網站」沒被路人聽。網站、CDN、客服後台都可能看到你送出的內容。

P2PE ≠ E2EE

E2EE 連服務商都讀不到;P2PE 允許處理器讀,只是不讓店家系統讀。

可以同時存在

聊天 App:TLS 護連線,E2EE 護訊息。刷卡機:P2PE 護卡號,機具連銀行仍可能再包一層 TLS。

瀏覽器顯示鎖頭,不代表只有你的 origin 能讀。CDN、WAF、反向代理常在自己那一端解開 TLS。對使用者來說仍是 HTTPS;對架構來說,那台邊緣節點就是「會拆包裹的倉庫」。

怎麼選:一條決策路徑

先問誰不該看到明文,再決定鎖要跨過誰。

做網站/API

強制 HTTPS。憑證、導向、HSTS 是實作細節,不是跟 E2EE 二選一。

做聊天、私密檔

產品若承諾「我們也看不到」→ E2EE。客服要搜訊息、伺服器要掃毒 → 不要喊 E2EE。

實體刷卡

問收單行/機具商有沒有 PCI 認證的 P2PE。不要把「POS 有裝 TLS」當成 P2PE。

官網金流

優先讓卡號不要經過你的伺服器(託管 Checkout、iframe、token)。這是減範圍,不是自研 P2PE。

已經有 TLS 還要不要再加

路上的人已經讀不到。再加鎖,只因為你不信任某一段中間角色:平台自己、店家後台、或會終止 TLS 的 CDN。

三種答案,三種不信任對象

選 TLS 是因為你需要伺服器讀內容才能提供服務。選 E2EE 是因為你故意讓自己讀不到。選 P2PE 是因為法規與盜刷現實,不讓卡號在店家環境出現明文。

生活對照速查

你在做的事路上的人中間平台/店家該有的鎖
網銀看餘額不該看到銀行伺服器要看到HTTPS
傳地址給朋友不該看到通訊軟體不該看到E2EE(外層仍有 TLS)
超商刷卡不該看到超商後台不該看到完整卡號;銀行要看到P2PE
官網填卡號不該看到若打進你的表單,你的伺服器會看到別這麼做;改託管頁。TLS 救不了「你自己變成中間人」

三個常見坑

不要把 HTTPS 講成端到端加密。端到端的兩端是兩個使用者裝置,不是瀏覽器與網站。Cloudflare 對 E2EE 的說明把範圍寫得很清楚。

E2EE 不是不會被駭。手機中木馬、螢幕被錄、備份沒加密、金鑰託管回伺服器,內容一樣外洩。Splashtop 也強調端點被攻陷時,傳輸加密幫不上忙。Metadata(誰、何時)通常仍可見。

不要把「點對點」三個字當成 P2PE。市面上有人把任意兩點之間的 TLS 叫 point-to-point。支付語境的 P2PE 指的是 PCI 那套:認證機具、金鑰不進商戶系統。沒通過這套,就不要在金流文件裡寫 P2PE。

小結

要上路:HTTPS/TLS。要不讓自己的雲讀內容:E2EE。要不讓店家系統碰卡號:P2PE。沒有「比較高級所以取代 HTTPS」這種選法。


筆者經驗與實踐模式:支付與熱門 API 才疊 E2EE

前文是比較文,三種鎖各有主場。這一節改以筆者口吻,說明我參與的產品線實際怎麼走——以這篇文章撰寫時為準。

接觸的經驗

接觸支付相關功能時,傳輸要進行E2EE端到端的加密處理。我當下的直覺是:通訊加密不是已經有 TLS/HTTPS 了嗎?還要在應用程式裡談金鑰、寫雙方協同的加密邏輯,很像多做一層。演算法、金鑰的產生與交換都不熟;同事裡不少人也把這看成特定領域才會碰的麻煩,也不是很熟悉,一時看不出它在防什麼。

後來才意識到,是自己對「伺服器這端會拆包裹」不夠敏感。TLS 保的是你到這台伺服器(或終止 TLS 的節點);支付與金融領域把卡號、交易細節再鎖一層,是故意讓中間的閘道、日誌、甚至自家部分服務都讀不到明文。

要正派、長久經營的公司,保障的不只是網址列有小鎖HTTPS,而是傳遞過程裡不該看到的人看不到。想通這點,E2EE 就不再像多餘的。

我們怎麼處理

我自己帶的團隊,跟前文一致:

  • HTTPS/TLS 固定會上。 網站、API、回呼,沒有「已經有 E2EE 所以可以省 TLS」這種選法。
  • E2EE 主要用在支付對接。 金鑰與演算法留在應用層,疊在 TLS 之上,讓支付相關的明文不要在中間節點攤開。
  • 少部分客戶端重要的呼叫、又容易常被攻擊的 API, 同樣加一層端到端加密。

不是所有介面都上 E2EE。多數請求只靠 TLS 就夠;真的要讓連我們自己的某段路徑都想要讀不到時,才把第二把鎖加上去。

延伸閱讀