2010-04-23 47 views
3

我在設計一個安全方案,用於加密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服務的響應。我不認爲你可以強制變長字符串。這聽起來不切實際。

有沒有人看到這種方法的問題?

+0

如果你走這條路,請注意。編寫加密代碼很難。有時候把某些東西拼湊在一起看起來很容易,但可靠的安全性依賴於不做出弄糟角落案例的假設。 – Stobor 2010-05-03 23:45:59

回答

1

顯而易見的解決方案是使用WCF建立SSL或TLS連接,而不是嘗試將其構建到應用程序中。

+0

這是不可能的,因爲這需要一個能夠運行WCF服務的託管提供程序。我正在嘗試在Silverlight應用程序和php網頁之間創建一個安全連接,該連接用於查詢數據庫並以xml形式發回結果。它也用於更新數據庫。主機提供商不提供ssl連接。我試圖將安全性構建到應用程序中,以免依賴SSL/TLS。 – cmaduro 2010-04-23 03:50:50

3

SSL/TLS從任何基於的Diffie-Hellman的實現你拿出會有的,因爲它仍然可以通過一箇中間人攻擊被打破了同樣的問題困擾。

原因TLS是安全的,值得信賴的是因爲客戶端,接收服務器的證書時,通過檢查,它是利用公知的可信身份的另一個證書籤名驗證它 - 說,威瑞信。迄今爲止,這使得它不可能制定一箇中間人攻擊,而無需VeriSign的私人關鍵 - 當入侵者發送僞造證書宣稱是服務器,客戶端將容易地檢測到該證書不籤使用可信身份證書並退出連接,向用戶顯示警告。

你的目的,很可能最容易使用TLS。爲了使它的安全,你會爲您的服務器證書,然後在客戶端嵌入該證書公共關鍵。然後,客戶機可以驗證它是說你的服務器,而不必暴露私有密鑰,您有分佈。

編輯:爲了迴應您對傑裏的回答的評論,如果您的託管服務提供商根本不允許SSL/TLS連接,防止中間人攻擊將會非常棘手。如果這是您避免TLS的唯一原因,那麼我會建議讓您的提供商將其啓用,或者找到允許提供該提供商的提供商。

編輯:在回答你的問題編輯:即使你正在使用RSA在您的Silverlight客戶端將數據發送到Web服務,如果你不能保證客戶本身尚未修改。攻擊者很可能挖掘你的客戶端,確定你用來執行加密/握手的算法,然後編寫代碼模擬你的客戶端(或者實際上,修改客戶端以包含他們的代碼)。一旦他們完成了這些工作,他們就可以開始分析您的API並使用它來調用您的Web服務。

這與SSL/TLS一樣 - 客戶端可以使用主機的證書驗證主機的身份,只要主機的服務器是安全的,客戶端就可以信任主機的輸出;然而,主機無法100%驗證客戶端是誰的機制,因爲客戶端將在沒有受控執行環境的機器上運行。

但是 - 儘管上述是真實的,而且它的可能,攻擊者可以通過這種方式危害您的系統,它很可能不是可能 - 除非你是一個面向公衆的系統上工作,吸引很多關注/使用,或者以某種形式直接處理金錢的系統,攻擊者需要付出一些努力才能將自己的輸入發送到Web服務。

最好的辦法是徹底驗證您的Web服務收到的輸入,並且不要讓您的常規客戶端永遠不會使用的懸掛API訪問。

+0

Silverlight有可能嗎? – cmaduro 2010-04-23 03:55:00

+0

您應該可以使用WebClient類並將其傳遞給https:URI以與PHP進行通信。 Web服務器只需要配置一個證書即可。 在Google上粗略搜索可以發現,您可能還必須使用應用程序設置XML設置才能允許TLS連接;我找不到比這更具體的信息,不熟悉Silverlight。 – 2010-04-23 04:05:46

+0

如果您的託管服務提供商完全不允許使用SSL/TLS連接,現在是時候獲得一個新的託管服務提供商...... – 2010-05-04 15:25:29

0

我建議先從這個JavaScript + PHP DH密鑰交換協議: http://enanocms.org/News:Article/2008/02/20/Diffie_Hellman_key_exchange_implemented

然後,您可以重新編寫Silverlight中的JavaScript。我建議使用Wireshark來轉儲數據包,然後您可以使用Meld或其他任何方法來區分數據包,以查看您的實現與原始實現的不同之處。

祝你好運!

(聲明:我完全Enano開發團隊同意,這不是一個完全替代SSL和SSL,應儘可能使用。)