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

Dee*_*ons 11 c# encryption passwords hash cryptography

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

dbo.aspnet_Membership

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

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

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

有关

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

Yah*_*hia 13

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

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

盐有什么作用?

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

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

注意:

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


Jor*_*ter 7

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

也就是说,您必须使用盐渍密码存储盐,否则无法在事后验证密码.

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

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