PHP开发API接口--数据验证 发表于 2018-11-22 | 分类于 编程 , php | 暂无评论 > 今天群聊时被某人博客高产似那啥给刺激到了,又鼓起了更新博客的欲望,今天来写写常见的api接口验证规则吧。 ## 验证加密串 ## 最常见的应该就是这种了。 需要的元素如下: - key - 请求数据 - 加密规则 **交互流程**: 客户端按加密规则生成密文,将密文放入请求数据一同请求至服务端,服务端将接收到的数据按同样规则加密,生成密文,并与客户端请求过来的密文做比对,判断是否一致。 **基础加密规则:** 按指定顺序将所有参与请求的字段值拼接成字符串,再拼接时间戳、key,再将拼接后的字符串MD5加密生成密文。 **示例:** 先假定一个规则: > 按照参数名做升序排序,然后将参数名和参数值联接成字符串,然后在最后加上key生成签名。数据格式为json。 然后假定该接口必须参数如下: - name //用户名 - time //时间戳,格式为YYYYmmddHHiiss 唔,这里说句,这俩参数是几乎所有api接口都必须的,服务端需要name来获取用户对应的key,time用来判断超时和充当随机数。 **伪代码:** > 客户端 $key = 'abc123'; $arr = [ 'name'=>'test', 'time'=>date('YmdHis') ]; //排序 ksort($arr); $str = ''; //拼接参数名与值 foreach ($arr as $k => $v) { $str .= $k.$v; } //再拼上key $str .= $key; //生成加密串 $arr['sign'] = md5($str); //curl发送请求 $url = 'xxxx.xx.xx'; $json = json_encode($arr); $this->curl($url,$arr); > 服务端 $arr = file_get_contents("php://input"); $arr = json_decode($arr,true); //根据用户名查询数据库,得到用户的key //伪代码我就不上数据库操作了,这里就直接当我获取到了,并赋值到$key ....获取key.... $sign = $arr['sign']; //删除$arr中的sign unset($arr['sig']); //排序 ksort($arr); $str = ''; //拼接参数名与值 foreach ($arr as $k => $v) { $str .= $k.$v; } //再拼上key $str .= $key; $new_sign = md5($str); //判断加密串是否一致 if($new_sign === $sign){ //验证通过 ....... }else{ //验证失败 ....... } 一个最简单的接口验证就完成了。 ## AES加密 ## 除了上面的验证加密串外,最常见的就是AES加密了,相比验证加密串最大的优势在于请求的数据本身就是加密的。 AES加密是可逆向的,所以交互时只需要传输加密后的密文,然后服务端解密。 本来也想说说这个的,但是想了想,这玩意在php中直接调用函数加解密就可以了...没啥好说的,囧。 唯一值得注意就是,PHP7.1中废弃了 mcrypt 扩展,被 OpenSSL 所取代。 嗯,如果有朋友需要,可以留言,我再更新AES的相关demo。