php - Cookie 加密/解密

标签 php cookies encryption passwords

我有一个网站,用户可以选择该网站“记住我”(又名设置 cookie),并且根据该网站上的建议,我将数据库中的密码加密切换为 php 的 password_hash() 功能。现在,我不能只是将任何旧的哈希值相互比较,因此我使用 php 的 password_verify()。密码验证需要明文和密码哈希。

如何将用户密码存储在浏览器 cookie 中而不是明文?

最佳答案

将密码存储在 cookie 本身中是一个非常糟糕的主意,不要这样做。

在很高的水平上,我会:

  1. 生成一个 token (类似于 md5),其中包含该用户的几个唯一(但一致)属性
  2. 将用户 ID 和此 token 存储在 Cookie 中(用一些已知的分隔符分隔)
  3. 当用户访问您的网站时,您可以将 ID 和 token 分开
  4. 使用 ID 从数据库中获取用户记录,从数据库记录中创建新 token ,并与 Cookie token 进行比较

让我们简单地回顾一下这一点。假设 $hash 是存储在数据库中的密码哈希,并且您还有该用户的 $userId$username 变量。

我会生成一个看起来像这样的cookie:

$token = md5($userId . $username . $hash);
$cookie = $userID . "|" . $token; // 1|XXXXXXXX

现在,当用户访问您的网站并且您检索此 Cookie 时:

$parts = explode("|",$cookie);
$userId = $parts[0];
$token = $parts[1];

现在您知道用户声称是谁,但您需要验证。

从数据库中取出用户记录,然后重新生成token并进行比较。

// Assuming you just ran a SELECT query, and fetched the result into `$row`
$dbToken = md5($row['userId'] . $row['username'] . $row['hash']);
if($token == $dbToken) {
    // The user is who he claims to be! Log them in
} else {
    // The cookie token didn't match our re-generated token, don't trust this cookie
}

有道理吗?您可能需要根据您的情况对此进行一些修改。希望这至少可以帮助您朝着好的方向前进。

关于php - Cookie 加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176514/

相关文章:

php - 在标题、导航和其他元素上使用 php includes 时的良好做法?

php - 在 Codeigniter 中编写此查询

javascript - javascript中的replace()回调函数没有被调用

JAVA:如何从需要启用 cookie 的站点下载 HTML 文件?

java - jasypt PBKDF2 实现

javascript - 带无限滚动的 Jquery UI 自动完成

asp.net - 表单例份验证随 session 过期

java - 将加密字符串作为 jsp 参数从一个 jsp 传递到另一个

android - 在流异常中没有找到与密文匹配的 key

php - 浏览器上的 JSON 缓存 header 不起作用