通過 HTTPS 共享用於 HMAC 身份驗證的共享密鑰的最佳方式是什麼?
我正在用 Java 編寫一個將使用 SHA-1 HMAC 消息身份驗證的應用程序。據我了解,通過 HTTPS 的連接被認為足夠安全,可以以純文字形式共享密鑰,並且在將密鑰從客戶端發送到伺服器之前對其進行雜湊處理幾乎沒有額外的好處。
因此,當第一次連接建立時,我的實現必須共享一個密鑰。之後,客戶端將發送一個 API 密鑰以及用於辨識客戶端並允許伺服器查找正確密鑰的消息。
有關我想使用的方法的更多資訊,我正在關注本指南(Gary Rowe’s Multibit Merchant)。
目標是在後續連接上對客戶端進行身份驗證。
我的假設是否正確,即我可以在初始連接時通過 HTTPS 安全地發送密鑰?
HTTPS 本身不進行加密,它只是依靠 SSL/TLS 來為您的通信實施某種級別的安全性。問題在於底層算法的選擇——由於存在缺陷,SSL 2.0 已經被認為是不安全的。SSL 3.0/TLS 1.0 也發現了類似的(不太重要的)攻擊,因此只有知道伺服器和客戶端(瀏覽器)在幕後使用什麼,才能完全信任 HTTPS。
通常,用於傳遞密鑰(讀取任何密鑰)的方法假設了非對稱加密的努力(例如,參見 RSA)。因此,您的客戶將連接並發送他的(臨時生成的,如果必須的話)公鑰並接收用它加密的密鑰。該消息現在只能通過他的私鑰解密,該私鑰從未出現在 HTTPS 流量中,並且在數學上很難弄清楚。這在很大程度上是 HTTPS 的工作方式。
通常我會建議不要重新實現任何類型的加密,但是,如果您無法控制伺服器宣傳的 SSL/TLS 版本,我會在會話內進行加密的密鑰交換,並將其餘流量保持原樣。請記住不要自己實現原語 - 任何語言都有許多專用於此的函式和庫,包括用於簡單加密消息的高級原語,幾乎沒有選項。
這完全取決於您的技能以及您想要在系統內部施加的安全性。