加密日期/时间并创建令牌


Encrypting a date / time and also creating a token

所以我一直在为我的网站开发一个记住我的函数。

它目前有效,但我一直在使用基本数据,而不是加密,因为我想知道在学习时到底发生了什么。

我使用的是一个cookie,然后是一个存储相同数据的数据库,然后进行检查。每次登录时都会生成一个新的cookie/db条目。

因此,目前这将是cookie:(id的行是一个userid,这个cookie是在登录过程中设置的)

 date_default_timezone_set('Europe/London');
 $token = '1';
 $cookiedate = date('d-m-y h:i:s a', time());
 $cookie_val = $row['id'] . ':' . $token . ':' . $cookiedate;
 setcookie (
"cookie", 
$cookie_val, 
time() + (10 * 365 * 24 * 60 * 60),
'/'
 );

从这里开始,我的下一步是什么?此外,我也不太确定令牌,它应该是一个随机的字符哈希,只是用作一种额外的安全方法吗?

这个网站不会太大,登录别人的账户你不会造成任何损害,因为敏感页面有密码提示保护。

对现有技术的改进是:

  1. 生成20个字符的随机令牌,例如:

    bin2hex(openssl_random_pseudo_bytes(10));
    
  2. 将该令牌与用户标识符(以及其他相关数据)一起存储在数据库中。

  3. 将令牌值写入cookie中。

这防止了一些问题:

  1. 令牌数据只在服务器端已知,客户端只获取密钥。

  2. 用户可以吊销"记住我"令牌,以防止将来未经授权的访问。

  3. 篡改cookie值将导致未知的令牌值,因此访问将被拒绝。

成功登录后,您将生成一个新的令牌。

通常,为了避免数据篡改,可以使用hash_hmac()使用密钥对特定值进行散列。

为什么不简单地使用md5()对cookie进行哈希处理呢。