一、设计:验证三个参数,分别为:Token、Timestamp和Sign
(1)Token授权机制:用户登录后,返回一个token,并将tokenUserId以键值对的形式存放在缓存服务器中。每次进行 token 验证,如果token不存在,说明请求无效。
(2)时间戳超时机制:用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效。时间戳超时机制是防御DOS攻击的有效手段。
(3)签名机制:token+时间戳+其他指定参数(比如版本号等)进行加密,加密后的数据就是本次请求的签名sign,请求时候带上 sign。因为服务端也得到了 token+时间戳+其他参数,服务端进行计算后进行对比,跟当前的传进来的签名 sign 进行比对,如果不一样,说明参数被更改过,直接返回错误标识。
可以参考的 sign 设计:
/** * @param $arr 生成签名的参数 * @param $urlencode * @return string 返回加密后的签名 */ function get_sign($arr, $urlencode) { $buff = ""; //对传进来的数组参数里面的内容按照字母顺序排序,a在前面,z在最后(字典序) ksort($arr); foreach ($arr as $k => $v) { if (null != $v && "null" != $v && "sign" != $k) { //签名不要转码 if ($urlencode) { $v = urlencode($v); } $buff .= $k . "=" . $v . "&"; } } // 去掉末尾符号“&”,则根据字母从小到大进行排序了。其实不用这个if,因为长度肯定大于0 if (strlen($buff) > 0) { $stringA = substr($buff, 0, strlen($buff) - 1); }//签名加密并大写 $sign = strtoupper(md5($stringA)); return $sign; }
微信官方安全算法:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3