Authentication

防止假冒設備的身份驗證方案

  • June 1, 2018

我想要兩個嵌入式設備(稱為主設備和從設備)相互通信。對於智慧財產權保護,主設備必須拒絕假冒的從設備(反之亦然是前提但不是要求)。

我沒有找到滿足以下要求的方案:

  • Authenticated:對於從站接收到的每條消息,只有從站是真實的,它才知道如何解釋該消息
  • 耐重播:無法錄製與真正奴隸的對話並在以後與假奴隸重播,
  • 自治:不涉及第三方(信任與否),
  • 快速:從機的處理器速度較慢,因此任何數域理論密碼都是不可能的,即使對於密鑰交換也是如此

還:

  • 不需要保密,消息不是秘密,
  • 消息很短;永遠不會超過 16 個字節,
  • 從站有一個唯一的序列號,主站以明文形式接收,
  • 只有奴隸可以在其中嵌入秘密,而不是主人(並且每個奴隸可以是唯一的),
  • 只有master可以生成熵/安全隨機數據,
  • 沒有安全協處理器、SIM 或SAM模組。

即使這些消息不是秘密的,它們也可能必須被加密。如果對手獲得假奴隸並生成假命令(即假主人),那麼他們還不如從競爭中購買一切。我們(作為一家公司)依賴於連接多種從屬的主機的廣泛功能集。


我嘗試思考解決方案:

  • 公鑰密碼學密鑰交換方案:對於從站來說計算量太大。
  • 從站是一個加密預言機,主站知道一個(或多個)合法的明文/密文組合:重放攻擊。
  • 可交換密碼 $ E_{k1}(E_{k2}(P)) = E_{k2}(E_{k1}(P)) $ 這樣當 $ E_{k1}(E_{k2}(P)) $ , $ E_{k1}(P) $ 和 $ E_{k2}(P) $ 竊聽者都知道, $ P $ 無法取回。(CTR模式是不可能的)。我還沒有找到這樣的密碼。

我試圖盡可能徹底,但如果我錯過了一些要求,請告訴我。

$$ edit $$刪除了允許只聽假奴隸與真正奴隸共存的可選要求。

沒有加密解決方案,即在密鑰是唯一秘密的假設下是安全的。

Authenticated and Replay-resistant的要求意味著假的奴隸不能解釋真正的命令。因此使用加密。由於假定主機無法保存任何秘密,因此只有在從機中具有私鑰的公鑰加密才能保護該加密或其密鑰建立。假設奴隸還不夠強大。

即使我們放寬要求以允許:

  • 從機中隨機數生成(這通常是可能的,尤其是在具有秘密的設備中;例如,通過加密保存在 EEPROM 儲存器中的計數器,或從模擬源仔細累積熵,包括時鐘漂移和外部刺激的定時)。
  • 從站中的公鑰加密僅限於公鑰端(價格不到一美元的 PIC18F24Q10 可以在幾分之一秒內完成 RSA 的公鑰端,並且在第一次實例時可能只需要一次主站建立連接)。

對於具有加密安全性的東西,我們至少需要以下之一:

  • 從機中帶有私鑰的公鑰密碼術;這排除了 RSA,也許不是 ECC(取決於硬體、功率預算……)。
  • 大師的一些秘密(見最後一節)

密碼學可以幫助解決一件事:每個真正的奴隸的序列號都可以帶有在工廠編寫並由主人檢查的靜態密碼簽名。這不會阻止複製帶有序列號和簽名的真正奴隸,但將不可能製造出比已設法收集簽名更多的具有不同序列號的複製;它還可能允許根據序列號將複製列入黑名單(例如在新版本的主伺服器中)。

在從端上,僅需要使用 EdDSA 持久儲存和傳輸約 64 字節,以實現 128 位安全性(並且存在稍微更緊湊的簽名)。主節點根據它嵌入的公鑰檢查簽名(我們必須假設主節點的完整性)。私鑰僅用於生產真正的從設備。


白盒密碼術(我們的標籤white-box)可以允許主伺服器中的秘密。儘管它通常在確定的攻擊下失敗,但這是最接近令人滿意的解決方案的事情。草圖:

  • 詢問從站並給出其序列號;
  • 主機使用白盒加密技術使用白盒實現的主密鑰加密該序列號,並提供在製造時寫入從機的從機的多樣化秘密;
  • master 和 slave 現在有一個共享的秘密並使用(經過身份驗證的)對稱加密,如 AES-GCM(儘管如果要保護真正的 slave 免受重放,它需要一個 RNG 或持久儲存)。

改進:

  • 除了計算從屬的多樣化秘密之外,白盒加密用於主控;
  • 使用會話密鑰進行認證的對稱加密;
  • 從站包含幾個秘密,並根據主站提供的密鑰版本選擇它使用的密鑰(允許從白盒中提取主密鑰中恢復;使用該密鑰的從站複製將停止與新版本的master,可以使用改進的白盒加密);
  • 使用靜態加密簽名(見第二部分),最好只由奴隸加密傳輸,以使他們的收集稍微難一些。

我相信如果不違反您的指導方針或安全性,就不可能做您想做的事。您必須能夠至少建立一次安全連接才能在從屬設備和主設備之間共享秘密資訊。除非您最初擁有共享密鑰,或者您使用公鑰方案,否則您無法建立此連接。

假設您確實有一個共享密鑰,或者您可以一次性使用公鑰,您可以使用一個密鑰隨機數來進行重放抵抗和身份驗證,如果您決定將消息保密,甚至可以進行加密。

為此,您將在主伺服器中生成一些 128 位以上的隨機數 N,與從伺服器通信(使用共享密鑰/公鑰加密),然後對於每條消息,將 N 與消息進行散列,並將散列與資訊。在每條消息之後,遞增 N。slave 和 master 都應該跟踪相同的秘密 N,這意味著 master 可以重新計算雜湊以驗證消息並驗證 slave。而且因為 N 隨每條消息而變化,所以系統是抗重放的。通過使用數字散列消息,您還可以獲得一些消息完整性,這意味著沒有人可以更改您的消息內容,因為這樣散列將不匹配。

當然,如果這是一個現實世界的問題,並且您可以物理訪問設備,您可以通過物理媒體共享一些秘密,這將是最安全的方法(假設秘密的任何副本都被銷毀)。

引用自:https://crypto.stackexchange.com/questions/58838