因此,我想要保護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)
添加網站範圍的鹽是萬一有人創造了共同的用戶名的彩虹表。 這種方法看起來安全嗎?
你的問題與JSON沒有多大關係,是嗎?我認爲這可能有點長和沉重。看起來你確實在問:「當我只存儲加密密碼時,如何使用摘要式身份驗證?」 –