背景:服务端和第三方服务有接口对接,那么第三方有没有一种简单的方式判断请求发自合法的合作方呢?
有一种简洁的方式就是,双方维护同一份私钥,在发起请求的时候,发起方将当前的请求参数,按照key值进行排序,然后’key=value’拼接到私钥后面,进行md5的编码。接收方以同样的处理方式,签名一致则合法,否则非法。如下为php的对应的sig生成算法举例:
//摘抄自http://docs.developer.qq.com
$secret_key = '3023IU&xmsfs78';
ksort($params);
foreach ($params as $key => $value) {
$secret_key.= $key.'='.$value;
}
$sign = md5($secret_key);
return $sign;
//java示例
String sign = MD5Util.MD5(KEY_STRING + jsonData);
return REQ_URL"?sign=" + sign + "&data=" + URLEncoder.encode(jsonData, "utf8");
//请求接收方处理示例:
<?php
$sig = strtoupper($_GET['sign']);
$data = $_GET['data'];
$key = '12345';
if ($sig == strtoupper(md5($key . $data))) {
exit('验证通过');
} else {
exit('验证失败');
}
file_put_contents("D:/test/tempOut.txt", $key.PHP_EOL, FILE_APPEND);