2016-08-29 191 views
0

我寫了一個小的聊天應用程序,用戶可以寫對方的消息:身份驗證公鑰

  • 在第一次登錄時,用戶會生成一個公鑰/私鑰對,源自用戶密碼。
  • 公鑰將被髮送到服務器(數據庫)。
  • 如果用戶(A)想給用戶(B)寫消息,用戶A用用戶B的公鑰將消息加密併發送給服務器(然後服務器將它發送給用戶B)。

但是,如果有人使用數據庫訪問將會更改數據庫中用戶B的公鑰?然後攻擊者可以讀取所有消息。

是否有可能在數據庫中驗證公鑰並確保它沒有被更改,並且它100%屬於用戶B?

+0

在http://security.stackexchange.com上可能會更好地詢問這個問題。有趣的問題是,即使攻擊者已經滲透到服務器中,如何確保系統是安全的......我不認爲真的有答案,除了*不信任服務器*並確保私鑰在最初安全交換,然後存儲它客戶端。 – deceze

回答

1

因此,您正試圖防範攻擊者控制服務器並且服務器不可信任的情況。由於服務器不能信任任何信息,因此不能直接以任何形式的驗證使用它。服務器只能被歸爲愚蠢的傳輸方式,並且驗證需要直接針對其他對等方進行。

能夠在帶外交換密鑰會在這裏有所幫助,這意味着您可以以某種方式促進密鑰的直接點對點交換。由於很難在普通互聯網上信任隨機遠程對等的身份,因此您需要採用如Threema這樣的策略:您可以匿名獲得任何遠程對等的公鑰,但您與該對等方的關係未經驗證。只有您能親自見面並通過物理掃描互相驗證密鑰,QR碼纔是最值得信賴的關鍵。

爲了方便通過不可信任的服務器與遠程對等進行任何類型的密鑰交換,基本上需要實現Diffie-Hellman密鑰交換;服務器可以促進通信,但不知道正在交換什麼數據。這會在兩位同事同時上網的情況下發生(或者來回速度非常緩慢),所以在實際中可能會有些問題,具體取決於您的使用情況。

+0

這裏需要帶外公鑰驗證,但它不完全可信,因爲軟件本身可能已經被破壞。我們需要可重現的開源構建。 –