PHP中签名校验步骤
程序员文章站
2024-03-19 13:35:28
...
在接口开发中,PHP会向面向用户的APP端,小程序端提供安全有效的校验接口。
在PHP中,可实践的有签名sign验证法:
PHP服务端约定一个或多个混淆参数,参与签名生成,一般签名生成使用md5函数。
假如客户端提交的参数如下,用PHP数组简单描述,array('name'=>'linlong','age'=>24),一般这个客户端根据需要生成相应字段
先将get或post参数按键名排序,得到,age=>24,name=>linlong,
拼接成字符串,age=24&name=linlong,其中“&”符号可以自定义,也可去掉
将上步骤中的拼接字符串加上混淆字符组合,假如前后混淆参数分别为,1234,8974,则混淆后的字符串为:1234+age=24&name=linlong+8974,其中“+”为连字符,起到字符串连接的作用。
将混淆后的拼接字符串md5加密。如md5($aaa);
php端校验也是按照上面步骤进行,客户端传送过sign参数和其他参数,如post数据为,sign=adh2878238,age=24,name=linlong
将除sign之外的参数进行排序并连接,加上混淆字符串,最后md5生成服务端的sign,将服务端生成的sign和客户端传递来的sign进行字符比对。
PHP服务端简单代码如下:
function verify_sign($data){
if (!isset($data['sign'])) {
return false;
}
// 验证签名
// 保存客户端提交的sign参数
$origin_sign = $data['sign'];
// 客户端sign不参与校验,剔除
unset($data['sign']);
// 排序,按键名
ksort($data);
$sign_str = "";
foreach ($data as $key => $val) {
$sign_str .= $key . "=" . $val . "&";
}
// 去除最后一个“&”符号,不参与校验
$sign_str = substr($sign_str, 0, -1);
$sign = md5('1234' . $sign_str . '8957');
if ($origin_sign != $sign) {
return false;
}
return true;
}
其中混淆参数可以只有一个,可以由多个,根据需要设置,服务端和客户端约定好。
上一篇: payload模块使用(四)