存储盐以及散列密码的安全性如何

如果您查看了asp.net成员系统的表模式,他们会存储原始密码的哈希值以及用于生成密码的盐。 看下面的架构,

dbo.aspnet_Membership

ApplicationId UserId Password PasswordFormat PasswordSalt MobilePIN Email . . . 
  • 如果攻击者掌握了数据库,他是否更容易从盐中打开原始密码并散列密码?

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

  • 您会在代码中推荐这样的方法,还是硬代码常量盐

有关

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

有关ASP.NET密码/哈希/盐存储的详细信息,请参阅http://msdn.microsoft.com/en-us/library/aa478949.aspx

攻击者“被允许”知道盐 – 你的安全必须以一种方式设计,即使知道盐,它仍然是安全的。

盐有什么作用?

Salt使用预先计算的“彩虹表”帮助抵御暴力攻击。
对于攻击者来说,盐使暴力成本更高(在时间/内存方面)。
计算这样一个表是很昂贵的,通常只有当它可以用于多个攻击/密码时才会这样做。
如果您对所有密码使用相同的盐,则攻击者可以预先计算此类表,然后将您的密码暴力破解为明文…
只要你为每个密码生成一个新的(最好的cryptogrpahically强)随机盐,你想存储哈希就没有问题。

如果你想进一步加强安全性
你可以多次计算哈希值(散列哈希值等) – 这不会花费你太多但它会使暴力攻击/计算“彩虹表”更加昂贵……请不要发明自己- 有经过validation的标准方法,例如参见http://en.wikipedia.org/wiki/PBKDF2和http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes的.aspx

注意:

现在使用这种机制是因为“CPU时间”(可用于彩虹表/蛮力等攻击)正变得越来越广泛(例如,亚马逊的云服务是最快的前50名之一)全世界的超级用户,任何人都可以使用相对较少的数量)!

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

也就是说,您必须使用盐渍密码存储盐,否则在事后不可能validation密码。

您可以采取一些措施来使整个事情更加安全:

  1. 切勿使用相同的盐。 每个密码应该不同
  2. 使用长盐。 GUID通常是一种流行的选择。 我通常通过获取随机数的MD5哈希来生成它们
  3. 如果需要,可以多次运行哈希算法。 这延长了强制密码所需的时间。

我不会使用MD5 SHA1更安全。 但说实话,如果您对安全性和加密技术一无所知,那么这些function就是一种方式。 因此,没有人会失去那么多时间来攻击那些不会给他一些钱的东西:D。 如果您认为使用RSA并不安全,请使用非常非常长的数字作为密钥。