【问题标题】:Is openssl_encrypt secure enough to create a session token?openssl_encrypt 是否足够安全以创建会话令牌?
【发布时间】:2021-04-14 16:26:10
【问题描述】:

这个想法是加密包含会话数据(用户名和令牌到期)的字符串并将其存储在 cookie 中。每当 HTTP 请求通过客户端时,它会检查它是否可以解密 cookie 中的令牌,然后查询数据库以检查用户名是否存在并被允许访问目标资源以及是否尚未过期:

// create token
    $token = openssl_encrypt($username . "::" . $expiry,  "rc2-40-cbc", $key, 0, "00000000");
// then store in cookie

'::' 只是一个分隔用户名和有效期的分隔符。

// on http request, verify token
    $decryptedToken = openssl_decrypt($token,  "rc2-40-cbc", $key, 0, "00000000");
    if($decryptedToken != false) // token is valid
    
// extract data
    $tokenValues = explode("::", $token);
    $username = $tokenValues[0];
    $tokenExpiry = $tokenValues[1];
    
// then validate username and expiry

这样安全吗?

【问题讨论】:

  • 只要不暴露加密$key 就是安全的。
  • 为什么要放一些有被解密风险的东西。生成一个密码安全的令牌,让服务器跟踪到期并将令牌与用户、用户的 IP 地址以及您可能选择跟踪的其他功能联系起来。
  • openssl_encrypt 是否足够安全,可以创建会话令牌? 当然可以,但正如 Gabor 指出的那样,您使用它非常糟糕。

标签: php security encryption cryptography session-cookies


【解决方案1】:

由于多种原因,您的代码绝对不安全。请不要在没有基本了解您在做什么的情况下实施加密。

使用你的方法,用你家里的硬件,不到一天就可以破解db中的会话数据。

几个问题:

  • rc2-40-cbc 非常,非常
  • 它不是经过身份验证的加密
  • IV 不是为了好玩,您不能只输入零,因为这样行得通
  • 如果有足够的会话数据,结果将不适合 cookie
  • 相同的会话数据将被加密为相同的密文
  • ...

请注意,解决方案不会更改密码并添加 IV。解决方案是使用为您执行此操作的知名且经过测试的库。

顺便说一句,这个概念可行,但必须正确实施。

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 2013-02-03
    • 2015-06-06
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2013-03-02
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多