具体来说,我在PHP中这样做,但这个问题与内置的PHP会话机制无关;我正在为实验/教育目的创建自己的身份验证系统。
"不要制作自己的系统"在这里不是一个有用的答案,因为我想了解手头的概念问题,无论如何。
问题在于:
让我解释#3。
会话ID当然是存储在cookie中的长随机字符串 - 系统将其散列与数据库中的散列会话ID进行比较以验证有效会话,查找要使用的会话,并从那里开始知道他们以哪些用户登录等等。 与密码不同,会话ID是长的,随机的,并且保证唯一,因此每个会话ID都有一个单独的盐并不是很有价值。因此,您可以使用系统范围的salt,允许您对输入进行一次哈希,并根据该哈希在数据库中查找会话。
但是,密码哈希函数(至少,它们在PHP中可用的表单)总是自动为您生成一个盐(提供盐是不允许的或弃用的)并将其附加到哈希输出,并将输入与hash涉及使用特殊的验证函数,该函数使用与散列一起存储的salt来对输入进行散列并进行比较。 这意味着,当对会话ID使用密码散列时,无法根据会话ID快速查找会话,而是需要重新散列输入以分别与系统中的每个会话进行比较,这是不可行的,尤其是考虑到这一点发生在每个HTTP请求上。
我考虑过的可能解决方案:
答案 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可供选择。