安全密码哈希

SLa*_*aks 17 .net security passwords hash

我需要在.Net WinForms应用程序中存储单个密码的哈希值.

什么是最安全的方法?

特别是:

  • 盐,HMAC,还是两者兼而有之?
  • 盐多少钱?
  • 多少次迭代?
  • 什么编码?(密码是纯ASCII)

我假设算法应该是SHA512或HMACSHA512.

Sam*_*ron 32

使用至少128位或更长的安全随机盐来填充哈希值,以避免彩虹攻击并使用BCrypt,PBKDF2scrypt.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.速度是现代安全散列的设计目标,因为散列几乎是每个密码系统的构建块,并且通常在每个数据包或每个消息的基础上执行需求.

速度正是您在密码散列函数中不想要的.

快速密码验证功能是一个问题,因为它们可以使用暴力攻击.使用上面的所有算法,您可以控制"慢度"

  • 有时我想知道人们是否会在低估之前阅读我的答案 (9认同)
  • 我想补充一点,在`Rfc2898DeriveBytes`中有一个PBKDF2的原生.Net实现,这可能是目前最好的选择. (3认同)

Svi*_*ish 8

我可以推荐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);
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 5

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

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

对于独立应用程序中的单个密码,存储位置可能已经由系统自己的身份验证系统保护,我认为它不那么重要.单个强哈希可能已经足够好了,添加盐很容易,没有理由不这样做.