安全密码散列

我需要在.Net WinForms应用程序中存储单个密码的散列。

什么是最安全的方式来做到这一点?

尤其是:

  • 盐,HMAC还是两者?
  • 多少盐?
  • 多少次迭代?
  • 什么编码? (密码是纯ASCII)
  • 我假设该算法应该是SHA512或HMACSHA512。


    使用至少128位或更长的安全随机盐对您的散列进行清理,以避免彩虹攻击并使用BCrypt,PBKDF2或scrypt。 PBKDF2带有NIST认证。

    引用:Archive.org:http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html

    问题是MD5很快。 它的现代竞争者也是如此,比如SHA1和SHA256。 速度是现代安全散列的设计目标,因为散列几乎是每个加密系统的构建块,并且通常以每个数据包或每个消息为基础执行需求。

    速度正是你在密码哈希函数中不想要的。

    快速密码验证功能是一个问题,因为他们可以使用蛮力攻击。 使用上面的所有算法,您可以控制“缓慢”


    我可以推荐BCrypt.net。 非常容易使用,你可以调整需要多长时间才能完成哈希,这真是太棒了!

    // Pass a logRounds parameter to GenerateSalt to explicitly specify the
    // amount of resources required to check the password. The work factor
    // increases exponentially, so each increment is twice as much work. If
    // omitted, a default of 10 is used.
    string hashed = BCrypt.HashPassword(password, BCrypt.GenerateSalt(12));
    
    // Check the password.
    bool matches = BCrypt.CheckPassword(candidate, hashed);
    

    对于具有大量密码的服务器端实现,您绝对应该使用像bcrypt这样的可调迭代方法。 关于该主题的这篇着名文章仍然(大部分)是相关的:

    http://www.securityfocus.com/blogs/262

    对于独立应用程序中的单个密码,其中存储位置可能已由系统自己的身份验证系统保护,我认为这不重要。 一个强大的散列可能足够好,添加盐很容易,没有理由不这样做。

    链接地址: http://www.djcxy.com/p/21557.html

    上一篇: Secure Password Hashing

    下一篇: Password hashing at client browser