安全密码存储和传输

时间:2010-03-30 11:33:07

标签: c# .net wcf security encryption

我正在为我的组织开发一个新的用户存储,现在正在处理密码存储。盐腌,HMAC等概念对我来说都很好 - 并且想要存储用户的密码(盐渍和散列,HMAC散列,或HMAC盐渍和散列 - 不确定最佳方式是什么 - 但理论上它赢了'重要的是,如果需要,它将随着时间的推移而改变。

我想要一个XML& JSON服务,可以充当客户端应用程序的安全令牌服务。

我已经为另一个系统开发了一个系统,这要求客户端首先使用SHA1双重加密明文密码,然后使用服务器为该会话提供的128个唯一密钥(或nonce)对HMACSHA1进行双重加密。

我想为新系统重复这一技术 - 将算法升级为SHA256(因为所有上述平台都可以使用实现,而且它比SHA1强得多) - 但是存在问题。

如果我将密码存储为用户存储中的盐渍哈希,则客户端需要发送该盐,以便在使用唯一会话密钥进行HMACd之前构造正确的哈希。这完全违背了首先使用盐的观点。同样,如果我不使用salt进行密码存储,而是使用HMAC,那仍然是同样的问题。

目前,我能看到的唯一解决方案是在用户存储中使用裸SHA256哈希作为密码,这样我就可以将其作为服务器和客户端的起点,以获得更安全的盐渍/ web服务的/ hmacd密码传输。

如果要访问的话,这仍然会使用户存储容易受到字典攻击;然而,不太可能 - 假设它永远不会发生,并不适合我。

非常感谢任何意见。

2 个答案:

答案 0 :(得分:1)

盐不需要保密 - 它必须是唯一的。 salt旨在减轻具有相同密码的两个用户的威胁,从而产生相同的哈希值。因此,如果您愿意,可以使用用户名作为盐。 salt使字典攻击变得更加困难,因为攻击者必须为每个字典单词和每个可能的盐计算每个结果。

在我看来,我会使用基于密码的密钥派生函数(PBKDF),它具有高迭代次数和盐。

http://www.bing.com/search?q=pbkdf2

这是C#中的示例代码,但它在今天大多数流行的框架中都有用 http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

答案 1 :(得分:1)

HTTPS是此问题的最佳解决方案。

你在这个问题上投入了大量的加密原语,希望它会消失。一般而言,您提议的协议似乎浪费资源,我建议对其他身份验证协议进行研究,并考虑简化协议的方法。 Practical Cryptography是一本很好的书。

最大的问题是看到客户端和服务器之间的秘密转移。为了正确实现这一点,您需要使用Diffie-Hellman密钥交换。幸运的是,一个已经用javascript编写:
http://enanocms.org/News:Article/2008/02/20/Diffie_Hellman_key_exchange_implemented

另一个问题是我没有看到客户端如何确定它与正确的服务器通信。 SSL使用非对称加密,由PKI支持,您无法在JavaScript中实现。

消息摘要不是加密算法。溢出密码哈希是绝对不可能的,因为密文是为了防止窃听。

向攻击者泄露密码盐会降低您的密码安全性。如果攻击者有盐,那么他们可以使用字典来攻击密码,而不需要随机猜测盐,使密码存储系统更加健壮。