日期:2016-06-13 阅读:1866
dmandwp系统 - wordpress系统和DM系统区块建站>>
http://www.liaoxuefeng.com/article/00146129217054923f7784c57134669986a8875c10e135e000
举个栗子:
假设用户仍以用户名"admin",口令"hello"登录成功,系统可以知道:
该用户的id,例如,1230001;
该用户的口令,例如,"hello";
Cookie过期时间,可由当前时间戳+固定时长计算,例如,1461288165;
系统固定的一个随机字符串,例如,"secret"。
把上面4部分拼起来,得到:
"1230001:hello:1461288165:secret"
计算上述字符串的md5,得到:"d9753...004d5"。
最后,按照用户id,过期时间和最终的hash值,拼接得到Cookie如下:
"1230001:1461288165:d9753...004d5"
当浏览器发送Cookie回服务器时,我们就可以按照下面的方式验证Cookie:
把Cookie分割成三部分,得到用户id,过期时间和hash值;
如果过期时间已到,直接丢弃;
根据用户id查找用户,得到用户口令;
按照生成Cookie时的算法计算md5,与Cookie自带的hash值对比。
如果用户自己对Cookie进行修改,无论改用户id、过期时间,还是hash值,都会导致最终计算结果不一致。
即使用户知道自己的id和口令,也知道服务器的生成算法,他也无法自己构造出有效的Cookie,原因就在于计算hash时的“系统固定的随机字符串”他不知道。
这个“系统固定的随机字符串”还有一个用途,就是编写代码的开发人员不知道生产环境服务器配置的随机字符串,他也无法伪造Cookie。
md5算法还可以换成更安全的sha1/sha256。
现在我们就解决了如何生成一个可信Cookie的问题。
如果用户通过第三方OAuth登录,服务器如何生成Cookie呢?
方法和上面一样,具体算法自己想去。