仅使用PHP在cookie中进行安全登录和授权

时间:2014-12-14 09:27:39

标签: php authentication cookies login

我正在为只有cookie和数据库的多个项目构建登录系统。我已经在SO和其他网站上阅读了一些答案,但我仍然不确定我自己的答案是否正确,或者我是否遗漏了什么。

到目前为止我有什么

我首先使用了用于识别用户的Cookie user_id 。我做了一个更改,使会话令牌独一无二,并从那里识别用户。它保存了一个cookie,一个数据库请求,并没有透露用户的id。

数据库表

  1. 用户 user_id 级别
    • level 是一个具有用户授权级别的tinyint字段。
  2. 会话令牌 user_id
    • 令牌是带有哈希令牌的索引字段
  3. 缓存

    1. session_token :持有 un 哈希 令牌
    2. 注意:数据库表会话包含 session_token 的散列版本,因此如果黑客可以访问表数据,则他无法直接访问原始令牌。

      代码

      $token = bin2hex(openssl_random_pseudo_bytes($length));
      $token_hash = hash($algo, $token);
      

      问题

      1. 这是制作令牌的正确方法,也是散列令牌的正确方法吗?
      2. 应该使用$length的内容?更多字符意味着更好的安全性吗?
      3. 应该使用$algo什么?
      4. 如果您散列的字符串大于散列输出的字符串,安全性会降低吗?
      5. 我的回答

        这些是我自己的答案。但是,就像我说的,我不知道他们是否正确。我把它们写下来只是为了更好地了解我对这个主题的看法。

        1. 是的,因为openssl_random_pseudo_bytes()可以安全地制作令牌。哈希很容易制作,并且可以在每次用户加载页面时执行以检查用户的级别
        2. 128个字符应该是好的。 bin2hex()将输出256个字符。当然,更多的角色意味着更好的安全性,因为蛮力攻击的成功机会较小。
        3. 使用sha512,输出128个字符。在更好的安全性和速度之间做出妥协。
        4. 会这么认为,因为重复的可能性更大。但这意味着答案2应该说64个字符。
        5. 其他信息

          • 登录将在会话表中创建一个具有唯一令牌的新条目。多个设备/浏览器允许每个用户多个会话。
          • 通过将 session_token cookie与存储在会话中的数据进行比较来验证用户(在每个登录用户请求的页面上发生)将验证用户是否已登录em>表。在同一请求中,将从用户表中提取级别,并将其与所请求页面所需的级别进行比较。

0 个答案:

没有答案