例如,使用 blowfish ,它会返回如下内容:
$2a$12$DEzG.CRsHpxpTOAHooQ.wuR6Xe9h6PxFPhOcOvf.lqDNw1TVYVnEO
包含有关散列alg类型的信息,它包含salt。很多资源都说只是将这个值存储在数据库中,它将是安全的。但是,有人可能只是针对这些值测试一个共同的密码列表来破解其中一些吗?
答案 0 :(得分:8)
密码散列的安全性不是来自秘密信息。您已经丢弃了实际的秘密,即作为哈希值基础的密码。剩下的哈希只是这种原始数据的一种指纹。安全性来自于无法从散列中导出原始数据的事实。唯一的可能性是尝试所有可能的密码,看看哪个产生相同的哈希。这里的安全性来自这样一个事实:这在计算上非常昂贵并且不可能在有用的时间内成功。
仅引入salt以防止某人使用已经预先计算的已知散列密码集,迫使攻击者实际使用唯一的salt重新散列所有可能的密码。盐本身并不是秘密,哈希算法也不是秘密。
简而言之:是的,该值绝对安全存储在数据库中。
答案 1 :(得分:5)
crypt()
生成的哈希是专门用于存储的。无论您的密码哈希方案是什么,如果有人获取您的数据库内容,他们将能够强制您的密码,并且您根本不能选择不存储密码哈希。 crypt()
应用的算法是专门选择的,因为它们需要大量时间来计算哈希值;当你只测试一个密码时,这一点并不明显,但强制使用数千个密码变得不切实际。
答案 2 :(得分:2)
但是有人不能只测试一个共同的密码列表 这些价值要破解其中一些?
无论密码如何存储,您都可以随时进行。 crypt函数不会阻止这种情况,但它会使它真的很慢。如果用户使用真正通用的密码(如123456),那么世界上没有任何哈希算法可以保护他。
如果您不允许使用这些简单密码并使用良好的哈希算法(即crypt()提供),那么您已尽最大努力保护密码。
答案 3 :(得分:0)
如果有人可以访问您的数据库,那么他们就可以访问salt,因为您应该为每个用户密码使用不同的salt(您最有可能将其存储在数据库中)。
盐的观点是彩虹表不起作用。个人必须重新散列密码+盐的每个组合以确定密码。您在每个密码上使用不同的盐,因此他必须为每个密码重新生成数百万个哈希值。
关于地穴的一些更好的信息可以在这里找到: Why does PHP crypt() prepend the salt to the hash?