盐需要有多强?
目前,我使用此功能在用户注册时生成“唯一”盐:
$salt = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'), 0, 12);
sha1
然后我将它与密码一起散列。
你怎么看?
PS。我不打算让 MySpace 变大。
盐需要有多强?
目前,我使用此功能在用户注册时生成“唯一”盐:
$salt = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'), 0, 12);
sha1
然后我将它与密码一起散列。
你怎么看?
PS。我不打算让 MySpace 变大。
谈到安全性,这并不是你的盐有多强的问题,而是散列函数的计算成本有多高的问题。SHA1 和 MD5 很便宜。如果您要坚持使用快速(弱)散列函数——这对于小型网站来说可能是完全可以接受的,我并不是要暗示其他情况——那么我不会担心盐的加密随机性。只要它是随机的,它就可以准确地消除一个攻击向量(彩虹表)。
随机字符取前 12 个字符的方法相当于在顺序重要时选择(不重复)12 个字符。你有 36!/(36-12)! ~~ 2^59 种可能的方法。
如果您从 36 个字母的集合中选择所有 12 个元素(可能有重复),则有 36^12 ~~2^62 种可能的方法。
因此,在您使用的方法中,您最终会得到大约 59 位熵。我会说它对于任何应用程序都足够了,并且只提供了比重复选择元素少 8 倍的组合。
随机盐的目的是确保如果数据库表泄露,简单的彩虹表将无法解密密码。如果每条记录都有自己的盐,那么每一行都需要一个新的彩虹表。
你的洗牌方法很好。要点是每条记录的盐是不同的,这样单个彩虹表就不会损害整个密码表。盐的“强度”并不那么重要。
盐的强度取决于您对安全性的担心程度。你可以简单地用用户名加盐(不是很强大),或者你可以为每个用户生成一个唯一的盐,就像你做的那样。
如果您真的很担心,您还可以创建一个加密密钥,并对其中的每一个进行加密。
你添加的越多,它就会越强,很明显。这就是您对安全性的担心程度。
您可以尝试在该盐中添加一些特殊字符,它会更强大。
长度为 12 个或更多字符的盐很难破解,但您也可以通过使用其他字符(即大写字母和特殊字符)轻松地使盐更强大。
您已经在为哈希添加盐并确保每条记录都有自己的盐,这非常重要。
任何足够随机的盐都“足够”强。你的盐的随机性和字符越多,哈希值就越好,但是任何几个字符长且随机的东西都可以。
这里有一些关于密码安全的有趣链接: