Cookie加密/解密

时间:2014-01-17 01:57:00

标签: php cookies encryption passwords

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

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

1 个答案:

答案 0 :(得分:3)

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

在很高的水平上,我会:

  1. 生成一个令牌(类似md5),该令牌由该用户的几个唯一(但一致)属性组成
  2. 将用户ID和此令牌存储在Cookie中(由某些已知分隔符分隔)
  3. 当用户访问您的网站时,您可以拆分ID和令牌
  4. 使用ID从数据库中获取用户记录,从数据库记录创建新令牌,并与cookie令牌进行比较
  5. 让我们简要介绍一下。假设$hash是存储在数据库中的密码哈希,并且您还为此用户提供了$userId$username个变量。

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

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

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

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

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

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

    // 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
    }
    

    有意义吗?您可能需要根据您的情况稍微修改一下。希望这有助于让你至少朝着一个好的方向前进。