Solidity

2FA / 通過智能合約進行身份驗證

  • February 25, 2022

如何在鏈上生成類似於 2FA 的東西?可以以某種方式秘密地使用私鑰或公鑰來計算值或其他東西嗎?我需要一種方法來驗證智能合約使用者呼叫者的身份,這樣其他人就不能假裝擁有他的聲明。

簡而言之:可能不會。

即使您使用諸如此類的變數定義,區塊鏈中的所有資訊都是公開的private

智能合約中的身份驗證通常針對發件人的地址進行。因此,對某些功能的訪問僅限於發件人地址的白名單列表。這樣你當然需要提前知道地址。

理論上,使用者可以使用他們的私鑰來計算一些秘密值(除了他們的公共地址)。但是使用這樣的值將毫無意義,因為管理員無法知道秘密應該是什麼,除非他們擁有相同的私鑰(這是禁止的)。

如果使用者使用他的私鑰創建了一個秘密並將結果發送給區塊鏈外的管理員,管理員將不得不將其添加到區塊鏈中(到秘密的白名單中)並且它會立即公開並且其他人可以使用它。

一種選擇可能是使用者發送帶有秘密的交易,智能合約會將交易標記為內部待處理。然後管理員(或某些後端系統)檢查區塊鏈外的秘密並向合約發出“好的,允許此交易”。但是,話又說回來,這種方式實際驗證將是脫鏈的,那有什麼意義呢。

這實際上取決於您追求的目標以及您需要的隱私、安全和去中心化級別。這還取決於您所說的“2FA”是什麼意思。

無論如何,如果您需要仔細檢查使用者的身份或其他什麼,您實際上必須依賴兩個不同的資訊。在您的問題中,聽起來您正在嘗試從第一條資訊(使用者密鑰)創建第二條資訊。

在使用者私鑰洩露的情況下,黑客擁有生成第二條資訊所需的所有資訊。因此,即使它是兩條資訊,實際上也只有一條。

如果您正在創建契約

  • 您無法真正控制使用者用於與您的合約互動的錢包/賬戶類型,除非您在滿足某些要求後手動為人們設置錢包並將特定地址列入白名單。
  • 您可能會通過鏈上預言機呼叫鏈下源進行驗證。這可以將外部資訊與使用者的鏈上地址/交易相關聯。但是,我認為使用者需要在鏈上源之前先對鏈上源進行身份驗證,這感覺很奇怪,但可以通過 UI/UX 解決。
  • 一旦他們完成 X 步驟,您也可以將地址列入白名單。未驗證其身份的地址無法通過您的智能合約發送。

不過更有趣的是……

如果您正在創建錢包:TOTP

  • 通常,當人們提到 2FA 時,他們指的是 TOTP(基於時間的一次性密碼)。
  • 這依賴於“共享秘密”。你有一個秘密,伺服器有秘密,數學和時間和算法被使用,如果secret + time + math匹配生成的數據結果,你就被授權了。
  • 這在區塊鏈上是不可能的,因為沒有地方可以放置不公開的“共享秘密”。而且,如果每個人都可以訪問您的秘密,那它就不是真正的秘密。😉
  • 可能存在一種中心化機制,其中交易需要簽署然後由第二方批准。使用者可以通過他們的設備生成交易,但需要通過集中的傳統服務批准它,以便它被完全簽名並發送到網路。在這種情況下,它將是private key on users device然後username + password + traditional TOTP 2fa在某處的伺服器上。這實際上是“三個因素”。

如果你正在創建一個錢包:沒有共享秘密

  • Yubikeys 和硬體錢包最常使用的 U2F 是另一種不依賴共享密鑰的 2FA 形式。這是它的工作原理:

    • 您,使用者,是唯一擁有秘密(私鑰)的人。
    • 伺服器生成質詢並將其發送給您。
    • 您的 U2F 設備對質詢進行簽名並將其發回。
    • 伺服器對其進行驗證並允許您登錄。
  • 同樣,這是假設伺服器,而不是智能合約。此外,這幾乎正是您簽署交易以發送您的加密資產時的目前情況。

    • 您決定要發送到哪裡,要發送多少。
    • 您以普遍認可的方式對其進行格式化。
    • 你用你的私鑰簽名。
    • 您將其發送到所有伺服器(也就是將其廣播到網路上的所有節點和礦工)。
    • 他們驗證您確實簽署了它。
    • 交易發送成功。
  • 這不是“兩個因素”,因為您沒有將其與傳統登錄結合起來——這只是一個因素:您的私鑰。

如果您正在創建錢包:無需共享秘密 + 需要多條資訊

  • 最安全、私密和去中心化的選擇將是多重簽名。
  • 多重簽名需要多個密鑰來簽署和批准交易,然後才能發送。
  • 雖然我們經常認為多重簽名適用於控製或保護大量資金的多個不同方,但它可以很容易地成為他們電腦上的使用者和手機上的同一使用者。
  • Gnosis Safe正在嘗試為普通使用者執行此操作。
  • 這是“兩個因素”,即使它不是您可能一直在考慮的手機上的程式碼。

引用自:https://ethereum.stackexchange.com/questions/68047