Rsa
使用非對稱加密時重用對稱密鑰是否安全?
我編寫了一個 C# 庫,希望將其用於商業應用程序中的安全目的。該應用程序將通過網際網路而不是內部網路進行通信。我使用 RSA 進行非對稱加密,使用 Rijndael 進行對稱加密。目前我正在使用的過程如下:
- 客戶端將其 RSA 公鑰發送到伺服器。
- 伺服器使用公鑰加密 Rijndael 對稱密鑰並將結果發送給客戶端。
- 客戶端解密對稱密鑰並儲存它。
- 當任何一方發送任何數據時,每次都會生成一個新的IV,但Symmetric Key保持不變。
我希望客戶端和伺服器之間的連接的生命週期在連接關閉之前最多持續 10-20 次資訊交換,因此使用相同的密鑰加密了 10-20 組數據,但使用不同的IV。在此之後,對稱密鑰被破壞。非對稱密鑰、對稱密鑰和 IV 都是由我正在使用的類生成的。
我所做的安全嗎?我是否遺漏了任何重大的安全漏洞?
編輯:我將 IV 與 Rijndael 加密數據一起發送,它與數據分離,然後由接收方用來解密數據。我在其他地方讀到這是安全的做法?
多次使用 AES 密鑰不是問題。但是,您的解決方案存在一個根本缺陷。伺服器無法驗證它是否收到了客戶端的真實公鑰。特別是,中間人可以擷取客戶端的公鑰,可以將自己的公鑰轉發給伺服器,然後可以解密每一方發送的所有流量(因為它將能夠解密 AES 密鑰) . 此外,客戶端在任何階段都無法知道它正在與真實伺服器對話。
除此之外,您還失去了人們喜歡在此類協議中擁有的許多屬性,例如前向安全性。
一般來說,編寫自己的協議(無論多麼簡單)都不是一個好主意。我的建議是只使用帶有前向安全密碼套件的 TLS v1.2。最好使用的是 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 或 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。但是,您仍然必須解決以某種方式使各方能夠相互辨識的問題,並確保使用正確的公鑰。這是通過使用證書來處理的。