生成登录令牌的最佳方法是什么?这种身份验证方法是否容易受到攻击?

ric*_*h97 13 php token websocket node.js lithium

我必须在我的Lithium(基于PHP框架)的应用程序中实现登录令牌.两个原因:

我想要一个"记住我"的功能.

我还需要一种跟踪服务器上登录的方法,以便我可以在node.js套接字服务器上验证经过身份验证的用户,如下所示:

  1. 用户请求页面
  2. 服务器在HTML中的某处返回一个带有会话令牌的视图
  3. 客户端JS读取令牌并将其发送到node.js服务器,以尝试通过Web套接字建立连接.
  4. 服务器接收连接请求并验证使用PHP服务器发送给它的令牌.
  5. 根据结果​​允许或拒绝连接.

所以这是一个两部分的问题,它只是为了验证我不是白痴,因为这个网站的安全性比平时更高.

这是创建登录令牌的合理方法吗?

<?php
// String::hash() generates a sha512 (by default) hash. 
String::hash(time() . $user['username']);
?>
Run Code Online (Sandbox Code Playgroud)

我提出的Web套接字认证系统是否理智?你能看到出现的问题或更有效的方法吗?

Art*_*cto 6

首先,您应该更改生成登录令牌的方式.与用户名连接的当前时间的哈希值远非难以猜测; 这是它安全的必要条件.有很多方法可以做到这一点,关键是你使用了很好的随机性来源.你可以这样做:

list(,$token) = unpack('H*', openssl_random_pseudo_bytes(15, $safe));
$safe or die("unsafe source");
Run Code Online (Sandbox Code Playgroud)

您使用的整体方法只有在您传递的持票人令牌从未发送过的情况下才是安全的.这意味着每次传输时都必须通过SSL/TLS传输.

还有一个问题是您可能会意外地将令牌发送到错误的位置,因此如果任何目的地以某种方式动态生成(例如通过某些发现协议),您必须格外小心.避免此问题的唯一方法是使用加密技术.


Nat*_*ele 5

你应该看一下RequestTokenLithium 中的课程:http://li3.me/docs/lithium/security/validation/RequestToken :: check()#source

它处理CSRF保护,并使用加密安全随机令牌,基于与上述类似的原则,但使用bcrypt提供额外的保护层,可以匹配任意数量的唯一哈希值.