建议加盐的原因很简单。一般来说,当你创建这个“指纹”时——如果你只使用一个数据项,它的数据集有限,那么外部黑客就更容易生成它,并劫持会话。
在上面的示例中,是的,如果攻击者同时拥有“指纹”和用户代理,那么他们将能够劫持会话。
添加盐只会使攻击者更难生成指纹,这是“如果他们只有一条信息,那么最后一条信息将变得无用”的情况
我建议您添加更多内容,例如,在 vBulletin(我曾经从事的一个项目)中,使用以下代码生成会话 ID 哈希(与指纹基本相同)。
define('SESSION_IDHASH', md5($_SERVER['HTTP_USER_AGENT'] . $this->fetch_substr_ip($registry->alt_ip))); // this should *never* change during a session
此外,会话哈希是使用生成的
md5(uniqid(microtime(), true));
这些都在尝试识别会话时被检查
因此,要劫持会话,此人需要知道以下内容
- 创建会话时服务器上的时间(准确)
- 用户浏览器代理字符串
- 用户的 IP 地址
他们还必须欺骗 IP 地址(或至少前 2/3 个八位字节)才能做到这一点。
如果他们实际上已经设法获得了上述信息,那么他们很可能能够以其他方式进行攻击,而不仅仅是会话劫持。
vBulletin 实际上并没有使用“盐”本身,但是,在你上面的例子中,盐只是增加了有限量的熵,总是最好找到尽可能多的熵。
例如,在我目前正在用 python 编写的东西中,我生成了一个散列以用于 XSRF 保护。以下是我使用的。
self.key = sha1(
self.user.username +
self.user.password +
settings.SECRET_KEY +
strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
).hexdigest()
它需要用户的用户名和密码、当前时间和预设的盐来生成它。由于盐和时间,这对于攻击者来说很难生成(不过,请注意,这只是因为一旦使用它就会改变,随着时间的推移,某人不需要太多如果它没有改变,则为特定用户破解它)