【问题标题】:Cookie Encryption/DecryptionCookie 加密/解密
【发布时间】:2014-01-17 01:57:00
【问题描述】:

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

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

【问题讨论】:

    标签: php cookies encryption passwords


    【解决方案1】:

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

    在非常高的层次上,我会:

    1. 为此用户生成一个包含几个唯一(但一致)属性的令牌(类似于 md5
    2. 将用户 ID 和此令牌都存储在 cookie 中(由一些已知的分隔符分隔)
    3. 当用户访问您的网站时,您可以拆分 ID 和令牌
    4. 使用ID从数据库中获取用户记录,从DB记录中创建新的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
    }
    

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

    【讨论】:

    • 我有这么长的回答说同样的话,然后你说得更好。 +1 好答案。
    • 我认为这有效(因为它正在设置 cookie),我唯一的问题是我验证 cookie 的方式并没有真正起作用。 Code(见突出显示的行)
    • @mrkirby153 很高兴该方法似乎适用于您的情况。至于具体调试您的课程,请先执行print_r($_COOKIE) 以查看您实际拥有的内容。也许 cookie 数组不是您所期望的?也许verifyDatabase 没有被调用?我认为就代码的工作方式而言,您需要进行一些一般的 PHP 调试,与 cookie 令牌的具体工作方式无关。
    • @mrkirby153 你解决了吗?如果您使用我在回答中提供的 cookie/token 方法,如果您将答案标记为已接受,我将不胜感激。 =)
    • @jszobody 是的,我确实把它整理好了。它不起作用的原因是因为我忘记更改一些 if 语句和东西。你的回应也启发了我让我的饼干更安全。一切似乎都运行良好! (我会 +1,但我没有足够的声誉:()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多