2011-11-24 87 views
4

因此,我想要保護http json Web服務。如何在.NET中保護HTTP JSON Web服務WCF

我會有一羣系統用戶,他們都有用戶名和密碼。 我只想在數據庫中存儲用戶密碼的隨機哈希散列,以避免在數據庫被泄密的情況下發現所有密碼,並且避免預先計算的彩虹表/字典攻擊(每個密碼) 。

我一直在尋找的摘要式身份驗證,因爲它具有由服務器提供給客戶端使用隨機「現時」的防止重放攻擊,像這樣的好處:

A1 = string.hashMD5 (username + ":" + realm + ":" + password) 
A2 = string.hashMD5 (paramTable.method + ":" + paramTable.uri) 
requestdigest = string.hashMD5 (A1 + ":" + nonce + ":" + A2) 

然而,爲了服務器重新計算'requestdigest',它必須知道'password',但是我的服務器只能訪問salted hash。

如果我不使用鹽,我可以在客戶端增加一個步驟,像這樣的(因爲在客戶端的密碼是已知的) -

HashedPword = string.hashMD5(password) 
A1 = string.hashMD5 (username + ":" + realm + ":" + HashedPword) 
A2 = string.hashMD5 (paramTable.method + ":" + paramTable.uri) 
requestdigest = string.hashMD5 (A1 + ":" + nonce + ":" + A2) 

然後在服務器端我可以從數據庫中檢索哈希密碼以執行重新計算。

唉,客戶也需要知道鹽,以便正確地做到這一點,例如,

HashedSaltedPword = string.hashMD5(password+salt) 
A1 = string.hashMD5 (username + ":" + realm + ":" + HashedSaltedPword) 
A2 = string.hashMD5 (paramTable.method + ":" + paramTable.uri) 
requestdigest = string.hashMD5 (A1 + ":" + nonce + ":" + A2) 

使葉片被暴露可能返回鹽Web服務功能,得到一個用戶名發送鹽到客戶端無需驗證。 但是,然後任何人都可以獲得鹽。

我想知道的是,如果給鹽是一個問題或不是。 因爲它自己的鹽在沒有存儲在數據庫中的散列的情況下是沒有用的,並且如果數據庫被破壞,那麼攻擊者無論如何都可以訪問哈希和鹽。 接下來,如果我免費贈送鹽,那麼我也可以使用用戶名本身作爲salt,因爲這對每個用戶都是唯一的 - 因此我甚至不需要公開Web服務呼籲首先發現鹽。

你們認爲什麼?是否暴露鹽或有一個已知的醃製機制很重要? 還有其他想法嗎?

我並不是很擔心消化驗證的缺點 - 即客戶端不知道它是否與真實服務器交談。因爲,這不像客戶的密碼將會使用這種方法暴露出來,而且我也不會像信用卡那樣向客戶要求任何保密信息。即我想保護的東西駐留在我的服務器上,服務器不會向客戶端詢問他們的任何安全信息。

編輯: 嗯,其實我只是讀了這個鏈接Salt, passwords and security這基本上證實了我知道鹽並不重要。 所以我想實現一些sortof湊像:

HashedSaltedPword = string.hashMD5(password+username+siteWideSaltExistingOnlyInCode) 

添加網站範圍的鹽是萬一有人創造了共同的用戶名的彩虹表。 這種方法看起來安全嗎?

+1

你的問題與JSON沒有多大關係,是嗎?我認爲這可能有點長和沉重。看起來你確實在問:「當我只存儲加密密碼時,如何使用摘要式身份驗證?」 –

回答

0

您必須選擇您希望如何傳輸密碼。你想傳輸它只從客戶端到服務器端散列嗎?在這種情況下,服務器必須存儲密碼,否則將無法重新計算散列。你想要服務器不存儲密碼?在這種情況下,您必須以純文本格式傳輸密碼,以便服務器可以計算哈希並將其與存儲的哈希進行比較。

前一種情況需要在數據庫中存儲密碼,並且如果要保護它們,則應使用某些數據庫/應用程序級別的加密。後一種情況需要安全傳輸(HTTPS,VPN等),因爲密碼是以可讀形式傳輸的。

+0

實際上,這不需要存儲在數據庫中的密碼 - HashedSaltedPword = string.hashMD5(密碼+用戶名+ siteWideSaltExistingOnlyInCode),因爲在初始註冊時,這個HashedSaltedPword是我們存儲到數據庫中的。因此,在客戶端,而不是將明文密碼放入摘要認證中,首先我們計算客戶端上的HashedSaltedPword,然後將其代入摘要認證功能 – DaManJ

+0

因此,如果有人知道哈希,他不需要完全知道密碼?是的,它可以工作,但你又需要安全的運輸。 –