我在設計一個安全方案,用於加密silverlight客戶端和我創建的php webservice之間的應用程序級別數據。由於我正在處理公共網站,因此我從服務中獲取的信息是公開的,但是我提交給web服務的信息不是公開的。管理網站也有一個後端,所以自然,所有的應用程序數據都被從web服務推送到Silverlight管理後端,也必須加密。Silverlight中的Diffie-Hellman
Silverlight不支持非對稱加密,這將適用於公共網站。對稱加密只能在後端工作,因爲用戶不會登錄到公共網站,因此不能派生出基於密碼的密鑰。仍然對稱加密會很好,但我無法安全地將私鑰保存在Silverlight客戶端中。因爲它要麼必須硬編碼,要麼從某種配置文件讀取。沒有一個被認爲是安全的。所以......計劃B.
然後我的最後一種選擇是實現Diffie-Hellman算法,它通過密鑰協議支持對稱加密。然而,Diffie-Hellman容易受到中間人攻擊。換句話說,不能保證任何一方都能確定對方的身份,這樣就可以在沒有接收方知道的情況下攔截和改變通信。因此建議使用私有共享密鑰來加密密鑰協議握手,以便確認任一方的身份。
這使我回到最初的問題,導致我需要使用Diffie-Hellman,如何在Silverlight客戶端中使用私鑰而無需在代碼或xml文件中對其進行硬編碼。
我完全失去了對這一個的愛...有沒有任何答案呢?
編輯:
請記住,這是關於我推出我自己的自定義PHP Web服務。
我發現了一個我可以在Silverlight中使用的RSA實現。使用它來加密Silverlight客戶端和PHP Web服務之間的DiffieHellman密鑰協議的握手似乎很安全,並且隨後也使用它來加密已達成一致的對稱密鑰(它本身是從密鑰的結果生成的通過哈希交換)。
在此之後,我幾乎保證所有通信去 Web服務尚未被攔截,修改,然後重新傳輸(MITM)。但我相信這仍然是可能的;從技術上講,攻擊者模仿Silverlight客戶端並將消息發送到web服務(假設他們發現url)。
由於攻擊者不知道我的自定義web服務的「祕密api」,因此提供了未授權訪問的安全性,因此他們無法與之通信。
打破這種情況的唯一方法是暴力破解web服務,攻擊者可能認爲有效的任何字符串以嘗試獲取Web服務的響應。我不認爲你可以強制變長字符串。這聽起來不切實際。
有沒有人看到這種方法的問題?
如果你走這條路,請注意。編寫加密代碼很難。有時候把某些東西拼湊在一起看起來很容易,但可靠的安全性依賴於不做出弄糟角落案例的假設。 – Stobor 2010-05-03 23:45:59