2013-12-13 33 views
0

我目前正在研究一個web API。我需要確保從客戶端發送到服務器的消息具有足夠的安全性(不能被修改,被攻擊者讀取並能夠識別客戶端)。我的加密郵件設計是否安全?

我在這裏有一個初步設計。它足夠安全嗎?

我決定利用PKI。即, 服務器和客戶端都有一組RSA公鑰和私鑰。 服務器還有一個數據庫來存儲客戶端ID和他們的公鑰。

在客戶端和服務器通信之前,他們使用diffie-hellman密鑰交換來建立會話密鑰。用在diffle-hellman中的「祕密」是私鑰。發送的消息將由發件人的私鑰加密。因此,接收者可以使用發件人的公鑰來識別發件人,並防止中間人攻擊。然後建立會話密鑰K.客戶端發送:客戶端ID,E(K,消息),H(K,E(消息),客戶端ID) 其中H()是SHA256的哈希函數。

當服務器收到消息時,它計算H(K,E(消息),ClientID)並將其與接收到的HMAC進行比較。如果他們是平等的,那麼這個信息應該是安全的。

我知道我的設計無法防止重播攻擊。但我現階段不考慮它。我的設計足夠安全嗎?任何評論將不勝感激。非常感謝!

+1

你爲什麼要在這裏重新發明輪子?像SSL/TLS這樣的標準機制在這裏還不夠嗎? –

+0

我只是努力工作和學習裏面的東西。 – KenLai

+0

最好在http://crypto.stackexchange.com上提出這樣的問題 –

回答

0

就像你寫的,我想到的第一件事就是重播攻擊。您可以通過將時間戳或計數器添加到消息來防止它(這樣每兩個消息都不相同)。

此外,請注意,您仍然需要擔心如何分配公鑰。 如果您通過Internet執行此操作,則沒有證書頒發機構(CA) - 您嘗試獲取公鑰時可能會遇到MitM攻擊!

獲得一些真實密鑰的問題至關重要,並且在我看來 - 這是SSL需要處理的主要問題(它使用CA進行處理)。鑑於真正的對稱密鑰,加密和身份驗證非常簡單! (使用加密和MAC)

附加信息: 什麼是H?哈希函數或HMAC?兩者都是不同的東西!

您寫道:H(K,E(消息),客戶端ID)。如果將H稱爲MAC(MAC具有密鑰)並且K是密鑰,則最好對MAC和加密使用不同的密鑰。如果沒有 - 我認爲你不應該在密鑰上發送散列/ MAC。

而且最後兩件事情:

  1. 有人能(每次爲新的客戶端)剛剛與服務器聯繫多次,並導致DoS攻擊。

  2. 爲什麼你保存在客戶端的公鑰?在服務器第一次知道客戶端的第一個(希望是安全的)連接中,可以創建對稱密鑰並將其保存!它更短,更高效。

相關問題