cookie安全加密

本文为对cookie安全加密的一些个人看法,仅作记录,大家有什么好的建议方法可以留言。

cookie一般情况下用于记录用户登录状态的,比如userid,千万不要记录密码,由于cookie是存储在客户端的,所以cookie很容易被人劫持修改。比如登录成功后在客户端写入cookie('userid') = 1,在服务器读取cookie userid的值,如果userid在数据库用户表中可以找到则证明当前用户userid为1且合法登录,显然这样是不可行的。如果用户自行修改userid为2或者其它用户的userid,那么服务器就认为当前合法登录的用户userid为2,这样用户就不需要知道userid为2的密码就合法登录了,修改cookie可以通过直接修改浏览器cookie文件或者通过javascript修改cookie值达到欺骗服务器的目的,所以需要对存储在客户端的cookie要进行加密。

提到加密可能大家首先想到MD5,通过MD5算法对userid进行加密然后存储在客户端cookie中,由于MD5是不逆的,所以服务器在收到cookie(‘userid’)的时候也不可以解密,那么服务器应该在用户数据表中添加一个字段专门存储MD5加密后的userid,然后通过SQL查询到userid。虽然MD5是不可逆的,但是MD5还是可以暴力破解的,尤其是对于userid这种纯数字的,比如userid为12345,MD5加密后的值为827CCB0EEA8A706C4C34A16891F84E7B,我们把加密后的值放到http://www.cmd5.com/中解密看看,不到2秒结果12345就出来了。如果用户知道了你的userid只是经过了一次MD5加密,那么用户随便对一个已经存在的userid进行MD5加密,然后伪造cookie(‘userid’),此时服务器会认为用户为合法用户了,获取了其它用户的权限。那么我的建议是对userid进行两次MD5加密或者加一个复杂的key,因为越复杂MD5暴力破解就越慢,如果暴力破解需要2万年那就没有任何意义了。

上面提到的使用已知加密算法(如MD5)还是有漏洞的,最好的是自己编写一套加密算法,这样用户就无法伪造其它用户了。当然了不是每个人都有编写加密算法的能力,我们还是可以用DES加密算的,DES加密需要密钥,而且还可以解密,当用户登录成功后使用预先设置好的密钥对userid进行DES加密,然后存储到客户端cookie中。服务器读取cookie(‘userid’)时在服务器端使用相同的密钥进行DES解密,然后取得userid,由于用户不知道密钥(密钥存储在服务器上),所以用户也无法伪造成其它用户了。我的项目用的是Thinkphp框架,采用的Thinkphp自带的加密算法。此外为了防止用户通过javascript修改伪造cookie,可以设置cookie的httponly属性为true,这样cookie就只能通过服务器读取不能通过javascript读取了,也防止了恶意用户通过XSS跨站脚本攻击获取其它用户的cookie信息,一定程度上提示了安全性。

别以为这样就万事大吉了,既然不能伪造cookie了,但还是可以通过抓包获取其它用户的cookie的,毕竟cookie是在网络中传输的,那怎么办呢?可以用https协议代替普通http协议,这样恶意用户抓到的报文已经是密文了,也就不知道cookie了。

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值