PHP开发API接口--数据验证

今天群聊时被某人博客高产似那啥给刺激到了,又鼓起了更新博客的欲望,今天来写写常见的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。

添加新评论