PHP验证登录状态的效率和安全性问题

kesin
kesin This guy is lazy,Introduction has not been set

3 People liked this article · 2793 views

在使用了salt string之后,md5其实足够可靠 固定的私钥来做salt其实不好,一旦私钥泄漏之后就很麻烦,而且最痛苦的其实是你不知道你到底有没有泄漏 用户的密码字符串作为salt是更好的办法 签名字符串: {{{ $sign = md5('$user_id+$user+_password[+浏览器UA[+IP地址[...]]]'); }}} 里面爱加什么你可以自己发挥 存储到cookie里面的字符串为 {{{ $token = $user_id.','.$sign; }}} 然后你需要对用户记录做一个服务器端的缓存,缓存通过用户编号查询,里面至少要包含用户的密码 每次用户请求时,都会从缓存里面去拿他的密码来重新计算数字签名做比对 这样的好处有: 不存在私钥泄漏的问题,即使出问题也不会影响所有用户 slat字符串泄漏就等同于用户的密码泄漏,逻辑上是严密的 即使有人持有$token字符串,只要用户一修改密码,老的$token就马上失效了 在此基础上还可以有其它的发挥,比如用户记录设计专门的一个字段:salt,每次用户登录成功时就生成一个随机字符串更新到salt内,数字签名计算用 {{{ // 记得把$user_salt也放到缓存里 $sign = md5('$user_id+$user_password+$user_salt+...'); }}} 这样一来,每次用户重新登录之后,之前的$token一定会失效,不但安全性更高,而且还实现了每次只允许一个人登录使用 最后,记得在用户修改密码之后更新你的缓存 PS: 我自己的系统除了使用用户密码来计算数字签名之外,还使用了浏览器UA加固定私钥的方式对$token做了一次对称加密才放到cookie内,算是又多一层保护

Published on 2014-02-26 11:42

Disclaimers:

This document is written by kesin Original published on WeCenter ,The copyright belongs to the author。

Log in,More exciting content waiting for you to find,Contribute wonderful answers,Participate in comment interaction

go Sign in! No accountgoregister