2015-11-06 180 views
1

爲了學習目的,我創建了一個聊天應用程序,通過SSL/TLS完成連接,並且使用AES-CBC-256對消息進行加密,並且使用RSA- 2048。正確生成RSA + AES密鑰

AES密鑰是每個用戶每次會話隨機生成的(這意味着每個用戶每次會話都有一個密鑰),IV是隨機生成的(AesProvider.GenerateIV()),每次傳入密鑰消息被創建(在發送之前)。
在RSA方面,我生成一個安全的隨機會話名稱來存儲在容器中生成的私鑰併發送公鑰。我也使用與AES中相同的模型(每個用戶每個會話一個密鑰對)。

我還應該聲明我正在使用HMAC-SHA512來散列消息併發送使用與AES密鑰/ Iv加密相同的公鑰加密的HMAC密鑰。由於我讀過它不需要經常重新生成,我打算每5000或10000次呼叫重新生成HMAC密鑰。

問題:
1)我應該只爲每個用戶創建一個RSA密鑰對,並將它用於所有會話,還是現在這樣好?
2)是否使用相同的AES密鑰,只有像上面解釋的那樣改變IV纔算安全?

+0

這可能更好地通過https://security.stackexchange.com詢問。 – oleksii

+0

@oleksii謝謝,https://security.stackexchange.com/questions/104810/properly-generating-rsaaes-keys –

+2

此外,您可以使用Diffie-Hellman密鑰交換生成臨時會話密鑰,以實現完美的前向保密。 –

回答

1

沒有太多答案,因爲你在做什麼是最好的做法。

雖然有些說明;

每個會話的RSA密鑰對不是必需的(並且生成密鑰會消耗)。

在應用程序的整個生命週期中或多年以來,您只能擁有一個2048位強的RSA密鑰,因爲即使是電子商務網站或金融應用程序等對安全性要求最高的Web應用程序,也是如此。

對於每個會話你應該有一個隨機的AES密鑰/ IV對,這很好。

由於您正在安全地發送密鑰(RSA加密),並且您還在線路上安全地發送了HMAC值(AES加密),所以每個會話最好有一個HMAC密鑰(不是進程範圍)。

僅更改IV幾乎等於更改密鑰和IV(某種意義上),因爲如果更改IV,加密輸出對於相同內容將會不同。

但是請注意。爲了防止模仿您的服務器證書的中間人攻擊,您的客戶端代碼是通過簽名檢查來驗證證書,還是僅僅是您在客戶端未經任何驗證發送的公鑰?

您應該有一個自簽名持久性證書或生成由持久性證書(例如,CN = FrozenDeathChatServer)頒發的隨機證書(RSA密鑰對),其中客戶端軟件安裝期間的客戶端安裝在可信根證書頒發機構。

+0

謝謝。我將改變我的模型來獲得一個靜態RSA密鑰對,而不是一個隨機的HMAC密鑰。我還將研究如何實施ECDiffieHellmanCng。據我所知,中間人攻擊不能發生在我使用的客戶端 - 服務器模型中,因爲我使用WSS(基於HTTPS的WebSocket) –