如何散列数据库的会话ID?

时间:2017-06-07 14:29:20

标签: php

具体来说,我在PHP中这样做,但这个问题与内置的PHP会话机制无关;我正在为实验/教育目的创建自己的身份验证系统。

"不要制作自己的系统"在这里不是一个有用的答案,因为我想了解手头的概念问题,无论如何。

问题在于:

  1. 会话ID的敏感方式与密码非常相似,并且应使用类似的安全性(散列)
  2. 进行存储
  3. 由于速度的原因,定期加密哈希函数现在被广泛认为对此用途毫无价值。
  4. 现代密码哈希算法具有使散列会话ID不方便的功能。
  5. 让我解释#3。

    会话ID当然是存储在cookie中的长随机字符串 - 系统将其散列与数据库中的散列会话ID进行比较以验证有效会话,查找要使用的会话,并从那里开始知道他们以哪些用户登录等等。 与密码不同,会话ID是长的,随机的,并且保证唯一,因此每个会话ID都有一个单独的盐并不是很有价值。因此,您可以使用系统范围的salt,允许您对输入进行一次哈希,并根据该哈希在数据库中查找会话。

    但是,密码哈希函数(至少,它们在PHP中可用的表单)总是自动为您生成一个盐(提供盐是不允许的或弃用的)并将其附加到哈希输出,并将输入与hash涉及使用特殊的验证函数,该函数使用与散列一起存储的salt来对输入进行散列并进行比较。 这意味着,当对会话ID使用密码散列时,无法根据会话ID快速查找会话,而是需要重新散列输入以分别与系统中的每个会话进行比较,这是不可行的,尤其是考虑到这一点发生在每个HTTP请求上。

    我考虑过的可能解决方案:

    1. 为每个会话提供一个也会出现在cookie中的自动增量整数ID。这样,"会话ID"将作为更多的会话专用密码,而不是作为密码和ID的双重职责。整数将用于查找。这仍然不能让某人通过制作一个包含他们从数据库泄漏(或只是猜测)获得的信息的cookie来劫持会话;它们需要预先散列的SID,这是一个只出现在用户cookie中的长随机字符串。我可以看到的缺点是,如果发生cookie窃取攻击,攻击者将知道SID对应的会话而不计算任何哈希值或实际上试图劫持会话。结合数据库泄漏,他们还知道会话所针对的用户等等。尽管如此,这似乎并不是什么大不了的事。另外,我觉得我可能会遗漏更大的东西,因为会话管理传统上只使用cookie中的会话ID(也被视为密码)而不是单独的会话ID和会话专用密码。 / LI>
    2. 使用Keccak进行散列会话ID并接受会话ID不需要与密码相同级别的数据库泄漏缓解,考虑到应用程序需要对敏感操作(如更改用户密码)进行重新身份验证/ email / etc和会话都有空闲和绝对超时

1 个答案:

答案 0 :(得分:0)

PHP函数hash_pbkdf2不会生成它自己的salt,也不会在输出中附加盐。

string hash_pbkdf2 ( string $algo , string $password , string $salt , int $iterations [, int $length = 0 [, bool $raw_output = false ]] )

调用者控制输出长度,盐,迭代次数,有45 hash algorythms可供选择。