开发者社区> 问答> 正文

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

在用PHP做验证登录时遇到了一些问题。我的验证方法是:

1.规定一个私钥key,加密算法是把user_id和key连接起来后求md5
2.把user_id和加密后的密文存到cookies中
3.验证时从cookies取出user_id和密文,对user_id再进行一次加密,比较两个密文

想问一下这样做能否确保安全性?md5是否可靠?还有私钥有没有必要设置成与user_id相关的随机字串?

另外,一般网站在登录后都会在每个页面(通常是右上角)显示用户昵称或者用户名,甚至用户的头像,这些数据是存放在数据库中的,如果每个页面都要根据user_id来读取数据库,会不会造成效率下降?如果会,是否要把这些信息存放到cookies或者sessions中?或者是否要对读取数据库的方法进行优化?

展开
收起
落地花开啦 2016-06-16 18:12:13 2440 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    在使用了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一定会失效,不但安全性更高,而且还实现了每次只允许一个人登录使用
    最后,记得在用户修改密码之后更新你的缓存

    2019-07-17 19:41:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载