2

盐需要有多强?

目前,我使用此功能在用户注册时生成“唯一”盐:

$salt = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'), 0, 12);

sha1然后我将它与密码一起散列。

你怎么看?

PS。我不打算让 MySpace 变大。

4

6 回答 6

2

谈到安全性,这并不是你的盐有多强的问题,而是散列函数的计算成本有多高的问题。SHA1 和 MD5 很便宜。如果您要坚持使用快速(弱)散列函数——这对于小型网站来说可能是完全可以接受的,我并不是要暗示其他情况——那么我不会担心盐的加密随机性。只要它是随机的,它就可以准确地消除一个攻击向量(彩虹表)。

于 2010-01-03T17:54:28.773 回答
1

随机字符取前 12 个字符的方法相当于在顺序重要时选择(不重复)12 个字符。你有 36!/(36-12)! ~~ 2^59 种可能的方法。

如果您从 36 个字母的集合中选择所有 12 个元素(可能有重复),则有 36^12 ~~2^62 种可能的方法。

因此,在您使用的方法中,您最终会得到大约 59 位熵。我会说它对于任何应用程序都足够了,并且只提供了比重复选择元素少 8 倍的组合。

于 2010-01-03T19:56:56.433 回答
1

随机盐的目的是确保如果数据库表泄露,简单的彩虹表将无法解密密码。如果每条记录都有自己的盐,那么每一行都需要一个新的彩虹表。

你的洗牌方法很好。要点是每条记录的盐是不同的,这样单个彩虹表就不会损害整个密码表。盐的“强度”并不那么重要。

于 2010-01-03T20:54:47.920 回答
0

盐的强度取决于您对安全性的担心程度。你可以简单地用用户名加盐(不是很强大),或者你可以为每个用户生成一个唯一的盐,就像你做的那样。

如果您真的很担心,您还可以创建一个加密密钥,并对其中的每一个进行加密。

你添加的越多,它就会越强,很明显。这就是您对安全性的担心程度。

您可以尝试在该盐中添加一些特殊字符,它会更强大。

于 2010-01-03T17:40:21.823 回答
0

长度为 12 个或更多字符的盐很难破解,但您也可以通过使用其他字符(即大写字母和特殊字符)轻松地使盐更强大。

您已经在为哈希添加盐并确保每条记录都有自己的盐,这非常重要

于 2010-01-03T17:49:59.997 回答
0

任何足够随机的盐都“足够”强。你的盐的随机性和字符越多,哈希值就越好,但是任何几个字符长且随机的东西都可以。

这里有一些关于密码安全的有趣链接:

于 2010-01-03T18:01:50.207 回答