如果您查看了asp.net成员资格系统的表模式,他们会存储原始密码的哈希值以及用于生成密码的盐。见下面的架构,
ApplicationId
UserId
Password
PasswordFormat
PasswordSalt
MobilePIN
Email
. . .
如果攻击者掌握了数据库,他是不是更容易从盐中打开原始密码并散列密码?
在查看一些记录之后,似乎为每个密码生成了一个新的盐。这有什么意义?
答案 0 :(得分:13)
有关ASP.NET密码/哈希/盐存储的详细信息,请参阅示例http://msdn.microsoft.com/en-us/library/aa478949.aspx
攻击者"允许" 知道盐 - 您的安全必须以一种即使知道盐仍然安全的方式设计。
盐有什么作用?
Salt使用预先计算的" rainbow-tables"来帮助防御暴力攻击。
对于攻击者来说,盐使蛮力更加昂贵(在时间/记忆方面)
计算这样一个表是很昂贵的,通常只有当它可以用于多个攻击/密码时才会这样做
如果您对所有密码使用相同的盐,则攻击者可以预先计算此类表格,然后将您的密码暴力强制为明文...
只要你为每个密码生成一个新的(最好的cryptogrpahically强)随机盐你想存储哈希就没有问题。
如果您想进一步加强安全性
你可以多次计算哈希值(散列哈希值等) - 这不会花费你太多但是它会进行暴力攻击/计算" rainbow-tables"更昂贵的......请不要自己发明 - 有经过验证的标准方法,例如http://en.wikipedia.org/wiki/PBKDF2和http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx
注意:
现在使用这样的机制是 mandatrory ,因为" CPU时间" (可用于彩虹表/蛮力等攻击)正变得越来越广泛(例如,亚马逊的云服务是世界上最快的超级用户中排名前50位的事实,任何人都可以使用相对较小的数量)!
答案 1 :(得分:7)
盐的目标是减慢,而不是完全阻止黑客入侵数据库的可能性。但它大大减缓了黑客的速度!从几秒钟到几秒钟,取决于算法,盐的长度,以及其他因素,小时,月或宇宙寿命。
那就是说,你必须存储带有盐渍密码的盐,否则事后就无法验证密码。
您可以采取一些措施来使整个事情更加安全:
答案 2 :(得分:0)
我不会使用MD5 SHA1更安全。但说实话,如果您对安全性和加密技术一无所知,那么这些功能就是一种方式。因此,没有人会失去那么多时间来攻击那些不会给他一些钱的东西:D。如果您认为使用RSA并不安全,但使用非常非常长的数字作为密钥。