代码之家  ›  专栏  ›  技术社区  ›  Andras Zoltan

安全的密码存储和传输

  •  2
  • Andras Zoltan  · 技术社区  · 16 年前

    我正在为我的组织开发一个新的用户存储,现在正在处理密码存储。salting、HMAC等概念对我来说都很好,我想存储用户的密码,或者salted and hashed、HMAC hashed,或者HMAC salted and hashed,我不知道最好的方法是什么,但理论上这并不重要,因为如果需要的话,它可以随时间而改变。

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

    如果我将密码作为salt散列存储在用户存储区中,则需要向客户机发送该salt,以便在使用唯一会话密钥进行HMACd之前构造正确的散列。这完全违背了一开始就用盐的观点。同样,如果我不使用salt来存储密码,而是使用HMAC,那么问题仍然是一样的。

    这仍然使得用户存储易受字典攻击,如果它曾经被访问;不管这种可能性有多小——假设它永远不会发生——对我来说都不太合适。

    非常感谢您的意见。

    2 回复  |  直到 16 年前
        1
  •  1
  •   rook    16 年前

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

    您在这个问题上抛出了很多加密原语,希望它能消失。一般来说,您提出的协议似乎浪费了资源,我建议您研究其他身份验证协议,并考虑简化协议的方法。 Practical Cryptography

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

        2
  •  1
  •   Michael Howard-MSFT    16 年前

    盐不需要是秘密的,它必须是独一无二的。salt被设计用来减轻两个用户拥有相同密码从而产生相同哈希的威胁。因此,如果您愿意,可以使用用户名作为salt。salt使得字典攻击更加困难,因为攻击者必须为每个字典单词和每个可能的salt计算每个结果。

    在我看来,我将使用一个基于密码的密钥派生函数(PBKDF),该函数具有较高的迭代次数和salt。

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

    http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx