参数校验
签名过程
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
第二步,在stringA最后拼接上secret得到stringB字符串,并对stringB进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
发起请求生成校验示例
请求参数(nonce为每个请求生成的不同的随机字符串)
uid: 1
username: test
avatar: http://xxx.xxx.xxx.xxx.jpg
nonce: xxxxxxxxxxxxx
对请求参数排序组合得到stringA
stringA="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test"
拼接密钥”yyyyyy”
stringB="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test&secret=yyyyyy"
产生签名
signValue="3DB61D5B098BCBA7D2E2A0616541040A"
发起请求
GET
http://xxx.xxx.xxx/api?avatar=http://xxx.xxx.xxx.xxx.jpg&nonce=xxxxxxxxxxxxx&uid=1&username=test&sign=3DB61D5B098BCBA7D2E2A0616541040A
POST
http://xxx.xxx.xxx/api
POST内容:
uid: 1
username: test
avatar: http://xxx.xxx.xxx.xxx.jpg
nonce: xxxxxxxxxxxxx
sign: 3DB61D5B098BCBA7D2E2A0616541040A
接口收到请求校验示例
收到的$_GET或$_POST
uid: 1
username: test
avatar: http://xxx.xxx.xxx.xxx.jpg
nonce: xxxxxxxxxxxxx
sign: 3DB61D5B098BCBA7D2E2A0616541040A
去掉sign字段后的内容做排序组合
stringA="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test"
拼接密钥”yyyyyy”
stringB="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test&secret=yyyyyy"
产生签名
signValue=""
判断请求中的sign是否与生成的signValue相同
注意
* 用于签名的参数中应带有随机字符串,保证签名不可预测
* 请求参数内容中"@"开头的内容不参与生成签名
* 用于签名的参数中不应包含secret字段,secret字段被保留用于密钥
PHP版本随机字符串生成及签名算法
function nonce($length = 32){
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
function sign($params, $secret) {
ksort($params);
$sparams = array();
foreach ($params as $k => $v) {
if ("@" != substr($v, 0, 1)) {
$sparams[] = "$k=$v";
}
}
$sparams[] = "secret=" . $secret;
return strtoupper(md5(implode("&", $sparams)));
}
返回的数据格式
* status说明
* -1 参数校验失败
* 0 错误
* 1 正确
*text|string|原因
*data|array|返回的数据
文档更新时间: 2019-11-25 11:43 作者:漫漫