什么是生成login令牌的最佳方式? 这种身份validation方法容易受到攻击吗?

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

我想有一个“记住我”的function。

我还需要在服务器上跟踪login的方法,以便我可以validationNode.js套接字服务器上的身份validation用户,如下所示:

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

所以这是一个两部分的问题,只是为了certificate我不是白痴,因为这个网站的安全性比平常高。

这是创buildlogin令牌的合理方式吗?

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

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

你应该看看在锂的RequestToken类: http : //li3.me/docs/lithium/security/validation/RequestToken :: check()#source

它处理CSRF保护,并使用密码安全的随机令牌,基于类似于上面的原则,但带有bcrypt的额外保护层,可以匹配任意数量的独特散列。

首先,你应该改变你的login令牌的生成方式。 与用户名连接的当前时间的散列值不是很难猜测; 这是它的安全的必要条件。 有很多方法可以做到这一点,关键是你使用了一个很好的随机性来源。 你可以这样做:

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

您使用的整体方法只有在您传递的不记名令牌永远不会以未encryption方式发送时才是安全的。 这意味着每次传输时都必须通过SSL / TLS进行传输。

仍然有问题,你可能会意外地发送令牌到错误的地方,所以你必须特别小心,如果任何目的地是以某种方式dynamic生成(例如通过一些发现协议)。 避免这个问题的唯一方法就是使用密码学。

你可以使用uniqid()函数来生成一个唯一的ID,以提高你的安全性,然后你可以放下或者和时间一起使用。

 <?php String::hash(time() . uniqid() . $user['username']); ?>