如何在.NET WCF中保护HTTP JSON Web服务

时间:2011-11-24 01:03:49

标签: wcf json http authentication salt

所以,我想保护一个http json网络服务。

我将拥有一大堆系统用户,他们都拥有用户名和密码。 我只想在我的数据库中存储用户密码的随机盐水哈希,以避免在数据库被泄露的情况下发现所有密码,以及盐(每个密码)以避免预先计算的彩虹表/字典攻击。

我一直在研究摘要式身份验证,因为它可以通过使用服务器向客户端提供的随机“nonce”来防止重放攻击,如下所示:

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

但是,为了让服务器重新计算'requestdigest',它必须知道'password',但我的服务器只能访问salted哈希。

如果我没有使用salt,我可以在客户端添加更多步骤(因为在客户端密码已知) -

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

然后在服务器端,我可以从数据库中检索Hashed密码以执行重新计算。

唉,客户需要知道盐,以便正确地做到这一点,例如

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

因此,在没有身份验证的情况下将salt传输到客户端可能会暴露一个返回salt的Web服务函数,给定用户名。 但是,任何人都可以获得盐。

我想知道的是,如果给出盐是一个问题。 因为,如果没有存储在数据库中的哈希,它本身的盐就没用了,如果数据库被泄露,那么攻击者无论如何都可以访问哈希和盐。 接下来,如果我免费赠送盐,那么我也可以使用用户名本身作为salt,因为每个用户都是唯一的 - 因此我甚至不需要公开webservice调用首先要发现盐。

你们觉得怎么样?暴露盐或具有已知的盐渍机制是否重要? 还有其他想法吗?

我并不担心消化身份验证的缺点 - 即客户端不知道它是否正在与“真实”服务器通信。因为,这并不是说客户的密码会使用这种方法暴露出来,而且我不是要求客户通过此链接进行任何机密信息,如信用卡。即我希望安全的东西驻留在我的服务器上,服务器不会向客户询问任何他们的安全信息。

编辑: 嗯,实际上我只是读了这个链接Salt, passwords and security,它基本上向我证实了解盐并不重要。 所以我正在考虑实现一些类似的哈希:

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

添加站点范围的盐以防万一有人为普通用户名创建了彩虹表。 这种方法看起来安全吗?

1 个答案:

答案 0 :(得分:0)

您必须选择如何传输密码。你想将它从客户端传输到服务器端吗?在这种情况下,服务器必须存储密码,否则它将无法重新计算哈希值。您是否希望服务器不存储密码?在这种情况下,您必须以纯文本格式传输密码,以便服务器可以计算哈希值并将其与存储的哈希值进行比较。

前一种情况需要在数据库中存储密码,如果要保护它们,则应使用某些数据库/应用程序级加密。后一种情况需要安全传输(HTTPS,VPN等),因为密码以可读形式传输。