Encryption

協商沒有證書的安全連接?

  • January 16, 2020

我想 為使用者在兩台電腦之間建立安全連接以抵禦 MITM 攻擊提供*簡單的體驗。*類似於以下內容:

兩個螢幕上都會出現一個數字(可能是 base64),使用者驗證該數字是否相同並點擊“確定”。

有沒有一個標準的算法呢?

如果不是 - 以下內容是否安全?

  1. 每台電腦向另一台電腦發送其公共簽名密鑰。然後在每台電腦上
  2. 鍵是串聯的。
  3. 然後用 PBKDF2(或類似的)散列。
  4. 然後向使用者顯示兩台電腦上的雜湊值,如果它們匹配,則在兩台電腦上點擊確定。

由於攻擊者可以快速創建簽名密鑰(因為攻擊者不關心它們是基於素數的)嘗試創建與所示雜湊相同的密鑰,因此向使用者顯示的雜湊需要相對較長( 〜100位?)。

是的,所概述的程序確保公鑰在雙方都是真實的,假設兩台電腦都是可信的,已經生成了公鑰/私鑰對,保持私鑰保密,確保他們自己的公鑰在輸入雜湊的數據中,並且足夠寬。但請注意:

  • 必須就連接公鑰的順序達成一致;參與者(或他們的公鑰)的字典順序就可以了。
  • 需要一個抗衝突的散列(不僅是問題*“~100 位”*中隱含的抗原像散列),因為活躍的對手可以知道公鑰 $ A $ 和 $ B $ 雙方,然後是內容髮現 $ A’ $ 和 $ B’ $ (她/他知道相應的私鑰) $ H(A|B’)=H(A’|B) $ ; 因此雜湊可以是 SHA-256(35 個字母中的 50 個字元,或 Base64 中的 43 個字元)以實現 128 位安全性。
  • 像 PBKDF2 這樣的熵拉伸散列允許通過以下方式減小散列大小 $ 2\log_2(n) $ -位 $ n $ 迭代,例如 1300000 次迭代的 40.6 位,到 215.4 位(35 個字母中的 42 個字元,或 Base64 中的 36 個字元)。
  • 限制密鑰生成和接受密鑰之間的時間量可以進一步減小散列大小。

PGP/GPG 中的標準程序是每一方`

  • 已經生成了他們的公鑰/私鑰對(可能是不久前的);

  • 通過任何不可信的渠道(例如,公鑰伺服器)將公鑰(自認證)發送給對方;

  • 導入對方所謂的公鑰;

  • 讓 PGP/GPG 計算密鑰的“指紋”,它們本質上是公鑰的散列(可以在密鑰生成時預先計算一個人的指紋)。

  • 通過電話或其他可信渠道,確保指紋匹配;對話框可以去:

    • 嗨,鮑勃,我是愛麗絲,我會為您讀取我的密鑰指紋,請交叉核對:39 4D 6F 33 9A 37 83 A0 C3 D3 33 4D AD A4 A9 C7
    • 嗨,愛麗絲,這是鮑勃,我檢查了你的指紋39 4D 6F 33 9A 37 83 A0 C3 D3 33 4D AD A4 A9 C7,我會讀你的指紋,請交叉檢查:534E 287A 7D98 B1F7 0323 6F5F BE83 6B66 BBDD FC14
    • 嗨,鮑勃,我是愛麗絲,我檢查了你的指紋534E 287A 7D98 B1F7 0323 6F5F BE83 6B66 BBDD FC14,我們都準備好了。

是的,有兩種不同的指紋格式(128 位和 160 位);是的,這並非完全不受社交工程或音頻通道上的複雜攻擊的影響;是的,許多使用者只真正閱讀/檢查指紋的開頭部分和結尾部分,並跳過回讀,從而降低了上述攻擊的可能性。

請注意,如果雙方進行公平遊戲,用於 PGP/GPG 指紋的雜湊只需要(第二個)原像抗性,因此與問題中的系統相比,擁有兩個指紋不會增加要驗證的數據量。更新:通過公平遊戲,我的意思是交換他們的公鑰的任何一方都不會故意生成兩個具有相同指紋的公鑰/私鑰對,然後嘗試以他們的公鑰不是對方的為由拒絕簽名假裝。

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