关于c#:存储salt和散列密码的安全性如何

How secure is storing salts along with hashed password

如果您查看了ASP.NET成员资格系统的表架构,它们将存储原始密码的散列值以及用于生成密码的salt。请参阅下面的模式,

dbo.aspnet_成员

1
2
3
4
5
6
7
8
ApplicationId
UserId
Password
PasswordFormat
PasswordSalt
MobilePIN
Email
. . .
  • 如果攻击者掌握了数据库,那么他是否更容易从salt和hash密码中破解原始密码?

  • 在查看了一些记录之后,似乎为每个密码生成了一个新的salt。这有什么意义?

  • 你会推荐这样的方法吗,或者在代码中使用硬代码常量salt

相关的

如果攻击者知道盐对安全是无用的吗?


有关ASP.NET密码/hash/salt存储的详细信息,请参见例如http://msdn.microsoft.com/en-us/library/aa478949.aspx

攻击者"被允许"知道SALT——您的安全性设计必须确保即使知道SALT,它仍然是安全的。

盐有什么作用?

盐可以帮助防御暴力攻击,使用预先计算的"彩虹表"。
对于攻击者来说,salt使得暴力破解的成本(时间/内存方面)要高得多。
计算这样一个表是昂贵的,通常只在它可以用于多个攻击/密码时才进行计算。
如果您对所有密码都使用相同的salt,攻击者可以预先计算这样一个表,然后将您的密码强制转换为明文…< BR>只要为要存储哈希值的每个密码生成一个新的(最好的密码强)随机salt,就没有问题。

如果您想进一步加强安全性
你可以多次计算散列(散列散列等)-这不会花费你很多,但它使暴力攻击/计算"彩虹表"更加昂贵…请不要自己发明-有经过验证的标准方法可以做到这一点,例如http://en.wikipedia.org/wiki/pbkdf2和http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898 derivebytes.aspx

注:

如今,使用这种机制是强制性的,因为"CPU时间"(可用于彩虹表/蛮力等攻击)的可用性越来越广泛(例如,亚马逊的云服务是全球最快的50个超级互斥器中的前50个,任何人都可以以相对较小的数量使用这一事实)!


盐的目标是减缓,而不是完全阻止黑客入侵数据库的可能性。但它大大降低了黑客的速度!从几秒钟到,取决于算法、盐的长度和其他因素、小时、月或宇宙寿命。

这就是说,你必须用盐密码储存盐,否则事后就不可能验证密码了。

你可以做一些事情使整个事情更安全:

  • 不要用同样的盐。每个密码应该不同
  • 用长盐。guid通常是一个流行的选项。我通常通过获取随机数的MD5哈希来生成它们
  • 如果需要,可以多次运行哈希算法。这会延长暴力破解密码的时间。

  • 我不会用MD5sha1更安全。但是说实话,如果你知道安全和密码术的话,这些都是单向的功能。所以,最重要的是,没有人会浪费这么多时间攻击一些不会给他钱的东西:d.如果你认为你不安全,使用RSA,但使用非常维利亚非常长的数字作为密钥。