MVC 框架 Symfony 在创建记住我的 cookie 时使用以下方法:
/**
* Generates a hash for the cookie to ensure it is not being tempered with.
*
* @param string $class
* @param string $username The username
* @param int $expires The Unix timestamp when the cookie expires
* @param string $password The encoded password
*
* @return string
*/
protected function generateCookieHash($class, $username, $expires, $password)
{
return hash_hmac('sha256', $class.$username.$expires.$password, $this->getKey());
}
所以他们使用用户类的字符串,后跟用户名,然后是时间戳,然后是用户密码。它被一个永不改变的密钥加盐,并且对整个系统的所有用户都是平等的。
现在这是我的问题:为什么将密码放在cookie中?虽然它是经过哈希处理的加盐密码(使用另一个盐,每个用户都是唯一的),但这不是不必要的风险吗?
还是我在这里偏执?
此外,使用该哈希,似乎唯一独特的是过期时间戳。似乎可以复制一些旧的 cookie 并创建一个新的 cookie 来进行重放攻击,对吧?
更新
生成的 Cookie 是 base64 编码的,其解码后的内容是:
Somenamespace\YourApp\YourUserClass:MjQ2NjM=:1501576079:74fbfcddcc66c2a11586bf4e39e68ddb459afa3a3fa6684e93d03fc393ee1141
第一个元素是用户类。第二个参数应该是 base64 编码的用户名,但这是我得到的,所以我猜它是用户 ID。我也会尝试找出它是如何工作的。第三个参数是“过期”时间戳,所以你甚至不必猜测。第四个参数表示cookie hash。