2011-01-26 119 views
11

我正在研究构建一个登录系统,并且当您将一个2位数的盐传递给crypt()函数时,它会读取PHP手册,它将返回一个哈希字符串,并且该字符串的前两位数字是您使用的盐。为什么PHP crypt()会在salt中加入哈希值?

例如:

$salt = "kr"; 
echo crypt("mysecret",$salt); //returns "kreOI.F7eOQMY" 

我首先想到的是,就不会这样帮助别人谁是试图扭转你的哈希?

为了获得最佳的安全性,盐值保持秘密:

我在维基百科上说,它抬头salt

所以我不明白为什么然后crypt函数返回所有使用salt值的哈希值?

这是有原因吗?这应该是安全问题吗?

+0

这就是为什么我建议两部分的盐。一个在配置文件中是秘密的,但对所有用户都是一样的,另一部分与每个用户随机生成的不同密码一起保存。 – CodesInChaos 2011-01-26 17:34:31

+0

@meager,其实我试图升级一个我继承的。 – 2011-01-26 17:38:21

+3

维基百科不应该被视为福音。盐不是秘密。 – 2011-01-26 22:44:08

回答

1

crypt()函数已过时。在影子密码支持出现之前,它被用于散列旧式Unix系统的密码。盐在那里增加了暴力破解密码的复杂性。但是,由于盐是由密码子系统随机生成的,因此必须将其存储在明文中,以便任何未来的密码操作都能正常工作。如果在加密之前将盐嵌入到密码中,那么将无法验证密码 - 只要进行密码检查,您就必须尝试每一种可能的盐 - 非常不切实际。所以,salt被预先加密到密码中,所以你可以再次将它拉出以供将来使用。

crypted password: xxabcdefghijklmn 
        ^^- salt 
        ^^^^^^^^^^^^^^-- crypted pw 

if ('xx' + crypt('xx' + password) == 'crypted string') then 
    password is ok 
endif 

现在,crypt()是谷物盒解码器环的安全等价物。出于历史目的和低安全性“谁在乎它是否被破解”存储。对于任何现代密码的使用,你最好用更现代的哈希,比如sha1/sha256/md5。即使MD5被认为这些天被破坏,sha1在边缘有裂痕,并且(最后我检查了)sha256仍然是安全的。

3

是的,盐应该保密,但密码散列也是如此。让他们在同一个地方保持同样的秘密是完全可以接受的。要根据散列检查密码,必须将salt与密码组合,然后根据散列进行检查。因此,任何有权查看密码哈希的用户或进程都应该有权查看salt,因为密码哈希本身对于检查密码没有用处(除非您要暴力破解盐)。

盐的目的是,如果两个不同的用户有相同的密码,他们会散列到不同的东西。这也意味着字典攻击要复杂得多,因为你不能只对所有可能的密码进行散列,然后根据用户密码散列列表来检查它们以找到多个用户的密码。相反,您必须尝试单个salt的密码才能找到一个用户的密码,或尝试使用多种盐的可能密码的所有组合,以便找到匹配结果。但是盐的知识本身并不意味着你可以反转密码散列。这只意味着你可以对密码哈希进行字典攻击。

如果你能找到一种方法来保证salt比hash值更安全,那肯定不会是一件坏事,但很难看出当需要访问某个需要访问的程序时这是否可行二者皆是。

1

将salt添加到has中,以便在获取密码时知道使用哪种盐,并且要查看它是否与散列匹配。这里的想法是为每个密码使用不同的盐,以便有人不能预先计算哈希表。

你也可以为每个密码添加第二个盐(对所有人都一样),而不是告诉任何人它是什么。

1

PHP crypt从UNIX crypt()函数继承此行为,该函数用于在UNIX passwd文件中生成密码哈希。有必要将盐存储在某个地方,或者以后不能验证密码是否正确。对于passwd文件,简单的行为只是将salt(通常是两个字符)添加到加密密码的开头,这使得将它存储在单个字段中变得很简单。

盐的价值应该保密的说法容易被误解。为了最佳实践,您不应该发布您的盐,就像您不应该发布密码哈希一样。向攻击者提供散列和盐分可以让他们轻松运行强力攻击,而不会对系统产生可疑流量。但是,即使攻击者能够看到盐和哈希密码,系统仍应该是安全的。

事实上,你无法在存储散列,原则上这些散列不会被黑客以与散列密码完全相同的方式破坏。如果密码检查代码可以访问它,那么你必须假定系统受到攻击的人也可以访问它。

28

维基百科文章的作者正在将盐与搜索空间的想法混为一谈,暗示盐是阻止暴力攻击的一种方法。混淆这些想法并没有改善安全性;无法识别和描述这两个问题的人不是一个可靠的指导。

盐的目的是阻止预先计算的查找表(如彩虹表)。 Salt可以防止攻击者为“时间”交易“空间”。每一点盐都会使表格的存储需求翻倍;两个字节的盐会产生很大的差异(65536倍),但八个字节需要查找表中不存在的“yottabyte”存储设备。

盐必须存储在某个地方。如果你有一个有效的方法来保持“秘密”,为什么不使用它来存储密码并忘记哈希?没有;如果你想要真正的安全性,那么即使攻击者知道盐,也需要设计系统以防止暴力攻击。 本文假定盐可以保密,应视为错误。

最好通过加密(应用哈希函数数千次)和密码选择规则(最小长度,数字,特殊字符)来防止蛮力攻击。

假设盐不能保密,鼓励更好的加密和密码选择,这会导致更安全的系统。

相关问题