簡體   English   中英

通過JAVA DataOutputStream發送密鑰

[英]Send a Secret key over JAVA DataOutputStream

我正在開發使用對稱密鑰+ RSA的FTP工具。 我想通過數據輸出流將我的密鑰發送到服務器,該怎么做? 我嘗試跟隨

客戶:

 SecretKey secretKey = en_de_cryptor.returnSecretKey();
 String encodedKey = Base64.encode(secretKey.getEncoded());
 dout.writeUTF(secretKey.toString());  

服務器:

String secretKey = din.readUTF();
byte[] decodedKey = Base64.decode(secretKey);

但是我無法獲得解碼密鑰。 我該如何解決並在服務器端獲取密鑰。

正如大多數其他人指出的那樣,您遇到了一個問題,即您正在以明文形式發送不對稱密鑰的最重要部分,從而可以截獲秘密密鑰。 當然,您可以加密密鑰,但這會引入其他加密問題來解決。 如果使用對稱加密算法對密鑰進行加密,則需要解決密鑰協商問題。 雙方將如何以安全的方式就密鑰達成一致,以使第三方無法截取它?

在某種程度上,您正在解決SSL已經解決的問題。 為什么不只是使用它呢? SSL還經過了戰斗測試,安全專家已經使用了25年。 開發自己的版本意味着SSL開發人員可能會遇到類似的陷阱。

但是,如果必須重新實現,則將需要更改算法。 保護私鑰的最安全方法是永遠不要首先通過網絡發送私鑰。 非對稱加密使您可以在客戶端和服務器之間交換消息,而無需對稱算法存在密鑰協商問題。

這是一個可以解決關鍵一致性問題的算法:

  1. 讓服務器生成非對稱密鑰。 兩種選擇:
    1. 一次(即在服務器啟動時)生成一個非對稱密鑰,並且所有連接都使用相同的密鑰。
    2. 為每個客戶端連接時生成一個非對稱密鑰,從而使其更加安全。
  2. 當客戶端連接時,將服務器的公鑰傳輸到客戶端
  3. 客戶端將為對稱算法生成一個秘密密鑰(您如何選擇算法?SSL也解決了這一問題)。
  4. 客戶端加密使用服務器的公鑰這個密鑰
  5. 客戶端將加密的密鑰傳輸到服務器。
  6. 服務器使用其私鑰 解密消息,以獲得對稱私鑰。
  7. 現在,服務器和客戶端可以使用對稱加密交換任何加密的消息,並且第三方無法監聽。

即使您做到了這一點,您仍然可以接受中間攻擊 ,在這種情況下,當客戶端與客戶端和服務器交換消息時,第三方監聽程序可能會欺騙客戶端和服務器通過第三方發送未加密的數據。 這是一個簡單的示例,說明如何自己實施此操作可能導致您創建的安全性不僅僅使用SSL。

如果您確實發送了加密的有效載荷,則需要拋棄DataInputStream並使用直接的二進制流,因此您無需使用Base64Encoding將二進制有效載荷轉換為UTF字符串。

  1. 天哪,不要那樣做! base64不會給您任何安全性。 使用加密而不是編碼
  2. 您發送secretKey.toString(未編碼)而不是encodeKey

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM