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

时间:2011-11-15 07:11:30

标签: c# encryption hash cryptography passwords

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

dbo.aspnet_Membership

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

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

  • 您是否会在代码
  • 中推荐这种方法或硬编码常量盐

相关

Are salts useless for security if the attacker knows them?

3 个答案:

答案 0 :(得分:13)

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

攻击者"允许" 知道盐 - 您的安全必须以一种即使知道盐仍然安全的方式设计。

盐有什么作用?

Salt使用预先计算的" rainbow-tables"来帮助防御暴力攻击。 对于攻击者来说,盐使蛮力更加昂贵(在时间/记忆方面) 计算这样一个表是很昂贵的,通常只有当它可以用于多个攻击/密码时才会这样做 如果您对所有密码使用相同的盐,则攻击者可以预先计算此类表格,然后将您的密码暴力强制为明文...
只要你为每个密码生成一个新的(最好的cryptogrpahically强)随机盐你想存储哈希就没有问题。

如果您想进一步加强安全性
你可以多次计算哈希值(散列哈希值等) - 这不会花费你太多但是它会进行暴力攻击/计算" rainbow-tables"更昂贵的......请不要自己发明 - 有经过验证的标准方法,例如http://en.wikipedia.org/wiki/PBKDF2http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

注意:

现在使用这样的机制是 mandatrory ,因为" CPU时间" (可用于彩虹表/蛮力等攻击)正变得越来越广泛(例如,亚马逊的云服务是世界上最快的超级用户中排名前50位的事实,任何人都可以使用相对较小的数量)!

答案 1 :(得分:7)

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

那就是说,你必须存储带有盐渍密码的盐,否则事后就无法验证密码。

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

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

答案 2 :(得分:0)

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