Secure Password Hashing
我需要在.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
The problem is that MD5 is fast. So are its modern competitors, like
SHA1 and SHA256. Speed is a design
goal of a modern secure hash, because
hashes are a building block of almost
every cryptosystem, and usually get
demand-executed on a per-packet or
per-message basis.Speed is exactly what you don’t want in a password hash function.
号
快速密码验证功能是一个问题,因为它们可以使用暴力攻击。通过以上所有算法,您可以控制"慢度"
我recommend bcrypt.net。非常容易使用,你可以调整多久它会带两个做散列,这是很棒的!
1 2 3 4 5 6 7 8 | // 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迭代的方法的类。这条已知井的话题仍然适用:(mostly)
http:/ / /博客/ www.securityfocus.com 262
为一个单一的密码在一个独立的应用,在存储位置的冰可能已经安全的身份认证系统的自身系统,认为它不重要的多。一个单一的强大的散列可能好足够的冰,冰和盐易增了,没有理由不这样做。
这是一个API,它可以满足您的所有需要/需要:)
https://sourceforge.net/projects/pwdknet
您可以遵循已发布的标准,如PKCS 5。请参见http://en.wikipedia.org/wiki/pkcs以获取简短描述,或参见http://tools.ietf.org/html/rfc2898以获取RFC。
我认为你应该坚持以开放标准。上市的流哈希方案,"{会}使用OpenLDAP的"城市安全与widely极冰的使用。你可以找到的描述在这里。
www.openldap.org http:/ / /问题/数据/缓存/ 347.html
大多数的LDAP图书馆实施这个计划。
严格的安全:很开心
都会更安全。由于是关键的HMAC可以被A盐,都会做一个小的冗余,但仍然更安全,因为它会把更多的工作,两个裂纹。
每一位将双盐的组合,将需要被维持在一个彩虹表两个易裂的密码。但由于有一个密码,只有一只,盐,有可能不被需要。辨别的HMAC的块的大小对其标的散列密钥大小为1024比特,SHA512。块的大小应该是足够好的doubling或盐,但它会让tripling开裂的密码和一个彩虹表多,多的努力。
"有趣的是更好的。更多的酸性,会把它iterations均值的概念来确定正确的密码,如果是entered是固定的,但计算机和用户不会介意等待几秒的随verifying密码。有趣的是,有人会iterations均裂的密码将做更多的iterations也是。
不妨encrypt(与AES)的迭代,在salted HMAC的超级安全的密码,它就沿着与盐,使它更难。《密码结构的加密和密钥的密码哈希的一些组合。这是应该的appear executable如"rngcryptoserviceprovider"或"system.security.cryptography"。当我们和编码它不妨convert十六进制或base64,或更好的,36座或一些其他的低于预期的转换。
注:这是mostly写的笑话,但应该还包含一些真理。
哈希和盐。如果你只有一个哈希表你可以攻击了A市彩虹攻击(反向查找(GLT)和多盐使得这更难(随机盐将是最佳的编码。)你可能想你将base64编码或者你的resulting或十六进制字节数组。如果你只是简单的两大"Unicode字节数组作为你可以运行的风险,被一些数据丢失,因为不是所有的人物模式是有效的。这也允许一个比较散列方式更容易吗?(只是compare base64字符串或十六进制的,当你想验证而不是比较的字节数组)
西安的轮数增加不多slowing之外做下会attackers。但也使冰的冰。更多……很难重用的散列在未来,如果你失去了你所需要的两个或recreate哈希算法。你可能会检查出一个标准的密码哈希如Unix crypt在线系统。这允许你改变了哈希算法的平衡和不支持的版本。
但做一个简单的哈希+盐必须足够好的应用。
rngcryptoserviceprovider Generate a盐两个随机的密码,然后sha512与盐,终于和两个大的密码哈希和相应的盐,如果你想验证以后,一些文本equals可存储的密码。