跳至主要內容
進階

Payment Secret 支付密鑰

了解閃電網路的 payment_secret 機制,如何防止探測攻擊並支援多路徑支付。

8 分鐘

什麼是 Payment Secret?

Payment Secret(支付密鑰)是發票中包含的 32 字節隨機值,付款人必須在支付時 提供正確的 payment_secret 才能成功完成支付。這提供了額外的安全層。

必要功能: 自 2019 年起,payment_secret 成為閃電網路的標準要求。 所有現代錢包和節點都支援此功能。

為什麼需要 Payment Secret

Payment Secret 解決的問題:

問題 1:前向劫持攻擊

沒有 payment_secret 的情況:

  Alice --> Bob --> Carol --> 收款人

攻擊:Carol 是惡意中繼節點
1. Carol 看到 payment_hash
2. Carol 向收款人發起另一筆同 hash 的支付
3. Carol 獲得 preimage
4. Carol 使用 preimage 領取 Alice 的支付
5. Carol 不轉發 Alice 的原始支付

結果:Carol 獲得免費的服務/商品

有 payment_secret 的保護:

  Alice --> Bob --> Carol --> 收款人

1. 收款人生成發票,包含:
   • payment_hash
   • payment_secret(只有 Alice 知道)

2. Alice 在最終 HTLC payload 中包含 payment_secret

3. Carol 無法看到 payment_secret(洋蔥加密)

4. 即使 Carol 知道 payment_hash,
   也無法創建有效的支付請求

5. 收款人驗證 payment_secret 才會揭露 preimage

問題 2:探測攻擊

探測攻擊:

沒有 payment_secret 時:

攻擊者可以:
1. 生成隨機 payment_hash
2. 向目標節點發送探測支付
3. 觀察錯誤訊息:
   • "unknown payment hash" -> 路由可達
   • "channel exhausted" -> 通道餘額不足

這允許攻擊者:
• 發現私有通道
• 估計通道餘額
• 追蹤支付模式

有 payment_secret 的保護:

節點行為改變:

沒有正確 payment_secret 的支付:
-> 直接拒絕,返回 "incorrect_or_unknown_payment_details"

這使得探測更困難:
• 無法區分「hash 錯誤」和「secret 錯誤」
• 無法確認路由可達性
• 大大降低探測效率

MPP 中的作用

多路徑支付(MPP)與 payment_secret:

payment_secret 的關鍵作用:

MPP 將大額支付拆分成多個 HTLC:

發票:100,000 sats

拆分:
• HTLC 1: 40,000 sats(路徑 A)
• HTLC 2: 35,000 sats(路徑 B)
• HTLC 3: 25,000 sats(路徑 C)

所有 HTLC 共享:
• 相同的 payment_hash
• 相同的 payment_secret

收款人處理:

收到第一個 HTLC 時:
1. 驗證 payment_secret
2. 記錄 payment_hash + secret 組合
3. 累加金額
4. 等待更多 HTLC...

收到後續 HTLC 時:
1. 驗證 payment_secret 匹配
2. 驗證 payment_hash 匹配
3. 累加金額
4. 檢查是否達到 total_msat

達到總金額時:
1. 揭露 preimage 給所有 HTLC
2. 原子完成所有部分支付

安全保證:
• 沒有正確 secret,無法「搭便車」到 MPP 支付
• 每個部分都必須是同一個付款人
• 防止部分支付被劫持

技術細節

Payment Secret 規範:

發票中的 payment_secret(BOLT 11):

Tagged field 's'(type 16):
• 長度:52 data 字符(32 bytes)
• 值:隨機生成的 256-bit 值

範例發票字段:
s = 0x1234567890abcdef...(32 bytes)

洋蔥 payload 中的 payment_data(TLV type 8):

只在最終節點的 payload 中:

payment_data:
• payment_secret: 32 bytes
• total_msat: 8 bytes(TU64)

total_msat 用於 MPP:
• 表示整個支付的總金額
• 不是當前 HTLC 的金額
• 收款人用來判斷是否收齊所有部分

功能位:

var_onion_optin (8/9):
  支援 TLV 洋蔥 payload
  payment_secret 需要此功能

payment_secret (14/15):
  明確表示支援 payment_secret
  現在是強制要求

basic_mpp (16/17):
  支援基本 MPP
  需要 payment_secret

生成方式

Payment secret 應該是密碼學安全的隨機數。 每個發票必須使用不同的 secret。

儲存需求

收款節點必須記住發出的 payment_secret, 直到發票過期或支付完成。

不要混淆: payment_secret 和 payment_preimage 是不同的東西。 Secret 在發票中公開(給付款人),preimage 在支付完成後揭露。

相關資源

下一步: 了解 多路徑支付 如何利用 payment_secret 安全拆分支付。

已複製連結
已複製到剪貼簿