php开发api接口安全验证,开放api接口签名验证
就安全性而言,客户端与服务器之间的所有通信内容都要通过加密通道(HTTPS)进行传输,明文HTTP通道将是中间人及其各种变种的温床。中间人攻击简单地说就是恶意黑客可以操纵客户端和服务器之间的明文通信通道。黑客可以监听通信内容,窃取机密信息,甚至篡改通信内容,但加密的通信内容理论上是无法破译的。
URL签名生成规则
API的有效访问URL包括以下三个部分:
1.资源访问路径,如/v1/deal/find _ deals;
2.请求参数:即API对应需要的参数名称和参数值param=value,多个请求参数通过一个连接如deal _ id=1-85462appid=00000连接;
3.签名字符串,由签名算法生成。
签名算法如下:
1.按字典升序排列所有请求参数;
2.将上面排序的参数表串起来,比如key1value1key2value2key3value3.keynvaluen
3.app secret作为后缀,字符串进行SHA-1计算,转换成十六进制代码;
4.签名字符串是在转换成全部大写形式后获得的。
注意:请确保HTTP请求数据编码必须是UTF-8格式,并且URL也必须是UTF-8格式。
例如:
PHP服务器首先要给开发者分配一个appid和appsecret(正常情况下开发者要向服务提供商官网申请)。作为客户端,需要对官方发布的appid appsecret进行保密。
Appid将作为应用标识符在请求中传递参与接口请求,appsecret将作为唯一不必要的参数传递,但它将是验证当前请求的关键参数,只有应用开发者和发布服务器知道。因为签名是用相同的算法加密的,所以应用端和服务器端可以计算出相同的签名值。签名的实际意义在于服务器端对客户端的访问认证。从某种意义上说,签名机制类似于用公钥方法签名,用每个应用对应的私钥值解密,但这个解密过程的本质是检查签名参数值的过程。
假设分配:
$ appid=5288971
$ app secret= r5 e 2t 85t Yu 142 u 665698 fzu ;
移动客户端需要请求服务列表(可以为java或sf等移动客户端编写以下代码)
申请地址:http://web.com/server/list
参数:
$array=[
appid=5288971,
菜单=客户服务列表,
lat=21.223,
液化天然气=131.334
];
//1.对加密数组进行字典排序。
foreach($ array as $ key=$ value){ $ arr[$ key]=$ key;} sort($ arr);//字典排序的作用是防止后面的拼接加密因为参数顺序不一致而不一样。//2.拼接键和值$ str=“”;foreach ($arr as $k=$v) { $str=$str。$arr[$k]。$ array[$ v];} //3.用sha1加密,转换成大写//4。大写得到签名$restr=$str。$ appsecret$ sign=strtoupper(sha1($ restr));
[纬度]=21.223
[LNG]=131.334[sign]=c 096d 7811 e 944386 ce 880597 ba 334 a5 ab 640 b 088)
{appid:5288971, menu : u5ba 2 u 6237 u670d u52a 1 u 5217 u 8868 , lat:21.223, lng:131.334, sign : c 096d 7811 e 944386 ce 880597 ba 334 a5ab 640 b 088 }
$ Model=Model:find()-where( appid=:appid )-params([:appid =$ server array[ appid ])-one();
if($ model){ $ server secret=$ model-app secret;}
根据相同的字典排序和算法生成服务器的$sign,判断$sign是否相同。
$ client sign=$ array[ sign ];
unset($ server array[ sign ]);#生成服务器字符串$ serverstr=“”;foreach($ server array as $ k=$ v){ $ serverstr=$ str。$ k $ v;} $reserverstr=$str。$ serverSecret$ reserver sign=strtoupper(sha1($ reserver str));if($clientSign!=$reserverSign){ die(非法请求);}else{ //您的代码继续;}
当短信登录只适用于手机app时,可以设置secret的过期时间。在SMS登录之后,保存appid(userid)和密钥。每当用户打开app时,首先连接互联网询问登录是否过期,然后通过短信登录获取新的秘密。
附加:
有时,我们使用hash_hmac进行加密(我们在项目中使用它……)
函数makeSignature($args,$ key){ if(isset($ args[ sign ]){ $ old sign=$ args[ sign ];unset($ args[ sign ]);} else { $ old sign=} ksort($ args);$ request string=foreach($ args as $ k=$ v){ $请求字符串.=$k . = .urlencode($ v);} $newSign=hash_hmac(md5 ,strtolower($requestString),$ key);返回$ newSign}