首页 文章

如何在使用持久登录Cookie时检查数据库中的bcrypt-hashed Token的Cookie Token?

提问于
浏览
5

this popular solution中,持久登录Cookie涉及生成随机的128位"token"以保存在用户的Cookie中,Jens Roland建议:

并且不要在您的数据库中存储持续登录的COOKIE(令牌),仅仅是它的哈希!登录令牌是密码等效,因此如果攻击者 grab 您的数据库,他/她可以使用令牌登录任何帐户,就像他们是明文登录密码组合一样 . 因此,在存储持久登录令牌时使用强盐水散列(bcrypt / phpass) .

但是,如何检查Cookie令牌与数据库中的加密令牌以确认Cookie登录是否有效,当bcrypting Cookie令牌总是会产生不同的结果(因为bcrypting总是使用随机盐)?

换句话说,你不能只是加密Cookie令牌并在数据库中查找匹配项,因为你永远找不到,所以你如何根据recommended solution("The server keeps a table of number->username associations, which is looked up to verify the validity of the cookie.")将它与数据库中的哈希版本实际匹配?

Edit:

请记住,根据上面链接的推荐解决方案,单个用户可以为不同的设备提供 multiple Cookies /令牌 . 我提到这是因为答案已经提交(已被删除),认为每个用户只有一个令牌 .

1 回答

  • 1

    如前面的答案所述,bcrypt将随机盐存储为哈希的一部分,因此数据库中的每个令牌条目都包含 random_salthashed_token .

    在验证'remember me'登录cookie(应该包含 useridtoken )时,您需要遍历该用户标识的每个标记条目(通常只有一个条目,从不超过一个条目)并使用存储的方式单独检查每个条目随机盐:

    foreach (entry in stored_tokens_for_user) {
        if (entry.hashed_token == bcrypt(cookie.token, entry.random_salt))
            return true;
    }
    return false;
    

    (如果您的数据库作为查询语法的一部分内置了对bcrypt的支持,您可以创建一个准备好的语句来为您执行此操作)

相关问题