原文:《 Lightning authentication (LNURL-Auth) 》by heisenberg

作者: BTCStudy

引言

大多數人認為閃電網絡是一個實現快捷低成本比特幣交易的支付網絡。但是,你知道你可以使用閃電網絡錢包輕鬆、安全且匿名地登錄某些服務嗎?

口令

如今,互聯網上最常見的身份驗證方式是輸入用戶名和口令(譯者註:大家習慣稱為“密碼”)。這個概念已有數十年曆史,一直保持良好運作。但是,它有什麼缺陷?

為了方便起見,用戶通常會選擇容易被猜到或暴力破解的簡單密碼。或者,用戶會為多個服務設置同一個密碼。在後一種情況下,一旦某個用戶的密碼洩露,攻擊者可以同時入侵這個用戶在多個平台上的賬號。攻擊者只需在其它平台上嘗試相同的密碼組合。

閃電網絡如何用於身份驗證?

但是,我們能不能使用另一種安全的登錄方式來取代用戶名和密碼呢?這現實嗎?

本文將介紹LNURL-auth 協議。 LNURL 是一組擴展了閃電網絡功能的協議(我們已經在關於閃電網絡地址的文章中介紹了其中一個協議)。具體來說,LNURL-auth 負責的是登錄部分。

這種登錄方式實際是如何操作的?很簡單,打開一個支持LNURL-auth 技術的網站,用你的閃電網絡錢包掃描二維碼(就像過去支付發票那樣),即可成功登錄。就這麼簡單而已。這種登錄方式背後的運作原理是什麼?它安全嗎?

原理

所有閃電網絡錢包都有一個組成部分是私鑰。就像在比特幣網絡中那樣,私鑰是一個絕對不能向任何人透露的隨機數。誰知道你的私鑰就證明誰擁有你的比特幣。

在實際操作中,網站向你發送隨機數據,你用自己的私鑰簽署該隨機數據並返回簽名和公鑰。然後,網站驗證你的簽名,如果簽名是正確的,則你的身份驗證成功。這一切都依賴於你知道自己的私鑰,而且你是它的唯一所有者。沒有私鑰就無法創建有效簽名。

事實上,用於身份驗證的私鑰與用於證明比特幣所有權的私鑰不是同一個。身份驗證私鑰根據網站URL 生成,因此不同網站使用的私鑰不同。

有些初學者可能覺得這聽起來很複雜,但實際上就是你的身份與你的私鑰綁定而已。只要沒有人偷走你的私鑰,你只需掃描二維碼即可登錄各種服務。

你唯一要上心的就是保管好自己的私鑰。通常情況下,你可以使用種子短語(用於找回主私鑰的12 至24 個單詞)。

優勢和劣勢

相比傳統的用戶名和密碼登錄方式,私鑰登錄有何優勢

  • 你不需要創建、記住或存儲任何密碼。
  • 你甚至不需要填寫用戶名,你只需要“掃碼”。
  • 你的密碼(這裡指私鑰)永遠不會經過網絡傳輸,因此不會被攔截。
  • 針對每個服務生成的私鑰不同,因此你的身份不可能在多個服務之間形成關聯(例如,你使用同一個電子郵件或用戶名)。
  • 快速、簡單

有哪些劣勢

  • 目前為止,鮮有服務支持這種登錄方式。
  • 你必須擁有一個支持LNURL-auth 技術的閃電網絡錢包。
  • 擁有了你的錢包的完整訪問權限,就等於擁有了你的身份。
  • 你有責任保管好自己的種子詞。

實踐

上文已經說得很清楚,首先你需要一個閃電網絡錢包。就本例而言,我強烈建議你選擇非託管型錢包(確保私鑰的所有權在你自己手中),例如,Phoenix 或Breez。你也可以通過Zeus 運行自己的節點。

BlueWallet 同樣支持該功能,但它默認採用託管方式(即,由第三方代持私鑰),因此我並不推薦。目前Wallet of Satoshi 和Muun wallets 都不支持LNURL-auth 技術。

你必須正確備份你的錢包。一旦你丟失了錢包,你就會失去你的身份。當然了,你應該為訪問錢包設置額外的身份驗證方式(PIN、指紋、FaceID 等等)。

有人可能會覺得使用這種方式存儲身份有些危險。但是,如果有攻擊者入侵你的手機,繞過生物識別認證竊取你錢包中的身份,他也可以使用同樣的方式竊取你存儲在任意密碼管理器裡的密碼。

就是這樣—— 你不需要使用錢包付款,你甚至不需要往這個錢包裡存入比特幣。

哪裡可以嘗試基於閃電網絡錢包的登錄方式? Stacker.News 就是其中一例。

LNURL-Auth:基於比特幣閃電網絡的身份認證

結論

基於閃電網絡的身份認證是一個有趣的概念,用戶只需掃描二維碼即可登錄,具有很高的安全性、匿名性,而且非常人性化。

但是,LNURL-auth 技術本身仍處於早期發展階段。因此,我們需要等待一段時間來獲得更廣泛的支持,無論是在服務端還是錢包端。

與此同時,我還要強調的一點是,這種登錄方式不涉及“真人識別”,任何人都可以創建無數密鑰/錢包(即,身份)。因此,這個問題必須單獨處理。

不管怎麼說,試一試又不要錢。勇敢上吧!

進階

等等,就這麼結束了嗎?如果你是極客,又想深入了解這類概念的話,不妨跟我一起從技術角度來看LNURL-auth 技術。

每個非託管型錢包都有一個主私鑰(如果沒有,我們也有解決方案)。派生路徑m/138'/0包含所謂的hashingKey 。我們將hashingKey 與服務URL 一起放入HMAC 函數:

 1output = HMAC-SHA256(hashingKey, domain from URL string)

取輸出開頭16 個字節,並將它們拆分成4 個長度相等的部分,即可得到所謂linkingKey的派生路徑。每個服務(URL)的linkingKey 都是獨一無二的。

 1linkingKey = m/138'/<part1>/<part2>/<part3>/<part4>

掃描二維碼後,錢包會按bech32 格式解碼,得到一個HTTPS 鏈接。例如:

 https://web.com?tag=login&k1=random_data&action=login

tag參數告訴我們這是LNURL-auth, action參數註明行為是登錄(也可以是註冊等等)。此外,還有一個很重要的參數k1 ,它包含了我們需要使用linkingPrivKey簽署的長度為32 個字節的隨機數據。

同意登錄對話框後,錢包會使用同一個URL 進行響應,只增加了sigkey參數:

  • sig = 在secp256k1曲線上使用私鑰linkingPrivKey簽署的隨機數據k1

  • key = linkingKey 公鑰

https://web.com?tag=login&k1=random_data&action=login&sig=signature&key=public_key

最後,服務驗證簽名是否正確。驗證通過後,服務會基於我們使用的linkingKey 為我們分配身份。如果是註冊,服務會為我們創建新的身份。

如果你想了解更多細節並閱讀規範:

(完)