2012-03-20 78 views
0

我需要加密將要發送/接收的數據,客戶端服務器,反之亦然。沒有SSLStream的加密連接?

由於我現在無法使用SSLStream,因此我正在尋找其他方法。

在思考我所擁有的替代方案時,我被困在如何將數據以無法讀取/攔截的方式發送到客戶端。

這裏是我鑫卡特這樣做的:

  • 客戶端/服務器將有一個從字符串加載加密/解密從服務器接收到的數據的應用程序中的RSA私鑰。

  • 初始連接請求後,服務器將發送一個會話ID以及一個內部AES密鑰/ iv。

  • 從這裏開始,客戶端將使用RSA和AES進行通信。

我想從有經驗的人聽到一些新的想法或更好的方法做什麼,我需要在這裏它是:從客戶

發送加密數據到服務器,反之亦然,而無需使用SSLStream,但具有良好的安全性。

據我所知,擁有客戶端上的私鑰有風險,但我還沒有找到更好的解決方案。

+0

你需要認證客戶端嗎?或者爲什麼你需要一個私鑰? – CodesInChaos 2012-03-20 16:34:29

+0

CodeInChaos我需要私鑰,因爲這是我能想到的唯一方法,即發送加密的初始連接以獲取內部通信AES密鑰。否則,任何使用wireshark的人都可以抓住純文本的AES。我明白,他們可以竊取我的應用程序來獲取帶有證書的字符串,但隨後我可以通過混淆和其他方法使它們變得更加困難。 – Prix 2012-03-20 16:38:18

+0

爲什麼您需要向客戶端分發私鑰?這違背了RSA的目的。爲什麼客戶端不能生成隨機密鑰對並連接到服務器,使用服務器的公鑰來加密連接? – 2012-03-20 16:38:30

回答

1

如果你真的不能使用SSL,你可以自己建立窮人的SSL:

客戶知道一個RSA公鑰,服務器知道對應的私鑰。

要與客戶端進行通信,請創建可與AES一起使用的隨機會話密鑰。它使用RSA公鑰對其進行加密,並將其發送到服務器。它使用AES會話密鑰加密其餘的通信。

服務器用RSA私鑰解密第一條消息,從而得到會話密鑰。它將此密鑰用於其他通信。

這樣的客戶端不包含任何祕密,但通信本身是私人的。這個方案缺乏的主要是客戶端認證。

您還應該爲服務器 - >客戶端和客戶端 - >服務器流使用不同的隨機數/ IV。您可能還想要添加完整性檢查(MAC)。

+0

現在,在密鑰等的初始事務之後,客戶端被給予X分鐘以用用戶和密碼進行響應以與系統進行認證,否則其被斷開。 – Prix 2012-03-20 17:16:16

0

您可以做到這一點的唯一方法是使用共享密鑰:客戶端和服務器都知道,但沒有其他人做。

公鑰SSL的工作原理是證書(以及密鑰對)被鎖定到可以通過第三方(簽名機構)獨立確認的特定服務器/域。

只要你擺脫這個前提,你就可以接受公開密鑰加密的中間人攻擊,因爲你不能保證你在和誰通話(或者至少你不能保證有人不會攔截/中繼您的消息)。

如果您使用共享密鑰,則不需要公鑰,證書或其他任何東西 - 但是如果任何未授權方發現了您的祕密,那麼您就被搞砸了。

+2

您不需要CA來保護SSL。您可以簡單地將公共密鑰硬編碼到客戶端。基本上,您使用單個證書作爲受信任的根。這樣你就不需要共享的祕密,但你並沒有鎖定到某個域。 – CodesInChaos 2012-03-20 16:58:55

+0

但是,如果攻擊者抓住了他/她的手(在交換過程中),他/她可以在程序中更改密鑰並播放「中間人」 - 這就是爲什麼您需要CA--如果不是程序是你必須首先在安全通道上進行通信 - 而蛇則吃它自己的尾巴...... – Carsten 2012-03-20 17:07:33

+0

你需要安全源程序,是的。但CA不能解決這個問題。在某種程度上,您需要獲取可信證書列表到客戶端。即使在服務器上使用CA簽名證書,攻擊者也可以簡單地將程序代碼更改爲不安全的程序。 – CodesInChaos 2012-03-20 17:11:36

0

一種可能的方法:

- 服務器有一個著名的公鑰,沒有人知道的私有密鑰(甚至沒有客戶端)

- 客戶端產生一個「握手」功能包,並用它進行加密服務器的公鑰。握手數據包包含您需要的任何初始化/身份驗證內容,以及用於AES加密的隨機生成的密碼+ IV。

- 服務器使用其私鑰解密握手數據包,現在可以訪問AES密碼+ IV。它用一個'ACK'數據包作出響應,表明它已準備就緒。

- 現在客戶端可以使用AES密碼短語進行數據對稱加密,服務器可以解密,反之亦然。

客戶端沒有必要將任何私鑰與它捆綁在一起。 RSA專爲數據交換而設計,無需共享密鑰。

+0

你需要客戶公共/私人的地方鍵? – Carsten 2012-03-20 17:05:24

+0

@CarstenKönig是的,這不是必須的(我最初想着用客戶端的公鑰加密ACK數據包,但這是多餘的)。我只是編輯我的答案來反映這一點。 – 2012-03-20 17:08:26

+0

axel_c謝謝你的迴應,我明白了,這就是爲什麼我在主要問題的評論中說「只有AES足夠了,我不需要過時這個想法」,我的意思是說,會發生一個使用RSA初始化加密數據,之後只有AES纔會採取行動,而不是具有共享私鑰,以保持加密作爲虛擬RSA保護的「輸入/輸出」。 – Prix 2012-03-20 17:23:50