2013-05-28 34 views
1

客戶端需要由服務器進行認證,所以需要發送憑證。憑據可以以加密形式存儲在客戶端數據庫中。由於服務器的證書是已知的,爲了提供最佳的安全性,客戶端可以使用服務器的公鑰來加密密碼。但現在的問題是如何在沒有雙重加密的情況下發送密碼。通過SSL發送預加密的數據

例如,假設服務器的認證URL是「https://example.com/a?u=user&p=password」,所以客戶端必須將此字符串的SSL加密數據發送到服務器。由於客戶端只存儲加密的密碼,因此必須找到將ssl_encrypt("https://example.com/a?u=user&p=")+pre_encrypted_password作爲一個整體發送到服務器的方法。

客戶端正在使用WinHTTP api,那麼有沒有什麼辦法可以實現這一點?

+1

很好的答案,但我想指出的是,即使結果是密碼等效的,也有一個預加密密碼的動機:如果相同的密碼用於不同的服務器。由於不知道原始密碼,因此無法學習並在其他網站上嘗試。這與在摘要認證中預先計算靜態HA1然後「忘記」原始輸入(用戶名,領域,密碼)類似。 – Celada

+0

@Celada我認爲你應該評論答案,而不是問題;) –

+0

@Celada無論如何,你只是在說我正在努力實現的目標。理想情況下,我希望在不更改現有服務器代碼的情況下執行此操作。但它看起來像是由於SSL的事實,它不能這樣做。 –

回答

4

否。SSL不會這樣工作 - 使用在初始SSL握手期間建立的密鑰,通過SSL連接發送的數據使用對稱加密算法(通常是AES,RC4或類似算法)進行加密。服務器的公鑰/私鑰僅在初始握手期間使用;之後,他們不被使用。

不管怎樣,以這種方式存儲密碼並不會使它更安全。如果它以一種可以發送到服務器的加密形式存儲,任何設法獲得它的人都能夠以這種方式使用它;那加密的形式是與密碼等效的,所以它不比存儲密碼好!

0

潛在地,您可以保存服務器發送的證書(假設此證書具有允許加密的RSA密鑰),然後將其用於數據的PKCS#7加密,並將加密的數據發送到服務器。還有另外一個問題出現 - 服務器端代碼是否可以訪問證書。在許多配置中情況並非如此。所以服務器將無法解密數據。正如EJP所指出的那樣,這並沒有多大意義,因爲您只需使用相同的密鑰對數據進行雙重加密(技術上的密鑰將會不同,但增加的安全級別將會很小)。

+0

額外的保護措施是防止客戶端本地黑客攻擊,而不是針對網絡流量或「中間人」攻擊。 –