PHP 开发API接口签名验证

PHP 开发API接口签名验证

就安全来说,所有客户端和服务器端的通信内容应该都要通过加密通道(HTTPS)传输,明文的HTTP通道将会是man-in-the- middle及其各种变种攻击的温床。所谓man-in-the-middle攻击简单讲就是指恶意的黑客可以在客户端和服务器端的明文通信通道上做手 脚,黑客可以监听通信内容,偷取机密信息,甚至可以篡改通信内容,而通过加密后的通信内容理论上是无法被破译的。

URL签名生成规则

API的有效访问URL包括以下三个部分:
1. 资源访问路径,如/v1/deal/find_deals;
2. 请求参数:即API对应所需的参数名和参数值param=value,多个请求参数间用&连接如deal_id=1-85462&appid=00000;
3. 签名串,由签名算法生成

签名算法如下:

1. 对所有请求参数进行字典升序排列;
2. 将以上排序后的参数表进行字符串连接,如key1value1key2value2key3value3…keyNvalueN;
3. app secret作为后缀,对该字符串进行SHA-1计算,并转换成16进制编码;
4. 转换为全大写形式后即获得签名串

 

注意:请保证HTTP请求数据编码务必为UTF-8格式,URL也务必为UTF-8编码格式。

 

举个实例:

PHP服务端先要给开发者(APP)分配一个appid与appsecret (正常情况下,开发者要到服务提供商的官网申请),作为客户端,需要保留好官方颁发的appid & appsecret 

appid会在请求中作为一个应用标识参与接口请求的参数传递,appsecret 将作为唯一不需要参数传递,但是它将作为验证当前请求的关键参数,只有应用开发者和颁发的服务端才知道。由于签名是依靠同样的算法加密实现,因此,应用端和服务端可以计算出相同的签名值,签名实际意义在于服务端对客户端的访问身份认证。在某种意义上签名机制有点类似用公钥方法签名,用每个应用对应的私钥值来解密,只是这种解密过程实质就是核对签名参数值的过程。
假设分配:

$appid=5288971; $appsecret= 'r5e2t85tyu142u665698fzu';

移动客户端,需要请求服务列表(以下代码可以为java或sf等移动端编写)
请求地址: http://web.com/server/list

参数:

$array=[ 'appid'=>5288971, 'menu'=>'客户服务列表', 'lat'=>21.223, 'lng'=>131.334 ];

 

对应签名算法

复制代码
// 1. 对加密数组进行字典排序 foreach ($array as $key=>$value){ $arr[$key] = $key; } sort($arr); //字典排序的作用就是防止因为参数顺序不一致而导致下面拼接加密不同 // 2. 将Key和Value拼接 $str = ""; foreach ($arr as $k => $v) { $str = $str.$arr[$k].$array[$v]; } //3. 通过sha1加密并转化为大写 //4. 大写获得签名 $restr=$str.$appsecret; $sign = strtoupper(sha1($restr));
复制代码

 

将生产的sign签名一起写入array中,通过约定好的method方式发送参数到请求接口

$array['sign']=$sign;

 

打印$array

复制代码
Array ( [appid] => 5288971 [menu] => 客户服务列表 [lat] => 21.223 [lng] => 131.334 [sign] => C096D7811E944386CE880597BA334A5AB640B088 )
复制代码

客户端将数据封装xml或Json发送到服务端,服务端先解析

{"appid":5288971,"menu":"\u5ba2\u6237\u670d\u52a1\u5217\u8868","lat":21.223,"lng":131.334,"sign":"C096D7811E944386CE880597BA334A5AB640B088"}

$serverArray= json_decode($json,TRUE);

服务端查询appid对应的密钥

$model=Model::find()->where("appid=:appid")->params([":appid"=>$serverArray['appid']])->one(); if($model){ $serverSecret=$model->appsecret; }

 按照相同的字典排序与算法生成服务端的$sign ,判断$sign 是否相同。

复制代码
$clientSign=$array['sign']; unset($serverArray['sign']); #生成服务端str $serverstr = ""; foreach ($serverArray as $k => $v) { $serverstr = $str.$k.$v; } $reserverstr=$str.$serverSecret; $reserverSign = strtoupper(sha1($reserverstr)); if($clientSign!=$reserverSign){ die('非法请求'); }else{ // your code continue; }
复制代码

 

在仅适用短信登录做手机端app时,可以设置secret的过期时间,短信登录后,保存appid(userid)与密钥secret,每当用户打开APP时,先联网请求登录是否过期,过期重新短信登录获取新的secret。

 

附加:

有时,我们使用hash_hmac进行加密(我们项目中使用……)

复制代码
/* * 生成签名,$args为请求参数,$key为私钥 */ function makeSignature($args, $key) { if(isset($args['sign'])) { $oldSign = $args['sign']; unset($args['sign']); } else { $oldSign = ''; } ksort($args); $requestString = ''; foreach($args as $k => $v) { $requestString .= $k . '=' . urlencode($v); } $newSign = hash_hmac("md5",strtolower($requestString) , $key); return $newSign; }
复制代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/113671.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • linux——awk(7):awk数组详解

    linux——awk(7):awk数组详解awk中数组的使用。我们在其他语言中经常会使用到数组,awk中也可以使用。示例如下:与其他不同的是,awk中的数组元素值可以设置为”空字符串“,当设定某一个元素为”空字符串“时,打印出的值就是为”空“(注:”空格“不为”空“)。鉴于awk中,元素的值可以为”空“,我们就不能根据元素的值是否为”空“去判断元素是否存在了。另外即使在模式中没有提前设定某个字符的存在,如果print中进行了引用,…

  • 关于华为任正非裁员事件

    关于华为任正非裁员事件最近,关于“华为大力清洗34岁+的老员工”的新闻一直在发酵。消息是从华为的心声论坛传出,具体内容是华为职工反映,中国区开始集中清理34岁以上的的交付工程维护人员。而研发开始集中清退40岁以上的老员工,主要针对程序员。一时间,“华为无情”批评四起。  无风不起浪  华为公关对消息予以否定。但这件事明显已经掀起了不小的波澜。  创始人任正非近期在一份讲话中侧面回应了

  • Map<String,Object>转为JSONObject ,JSONObject 转为JsonObject,JsonObject转为JsonElement

    Map<String,Object>转为JSONObject ,JSONObject 转为JsonObject,JsonObject转为JsonElementpackagecom.tianjian.property.jieshuns.service;importjava.util.Map;importjava.util.Properties;importorg.apache.http.HttpStatus;importorg.apache.http.client.methods.CloseableHttpRes

  • Hibernate学习笔记

    Hibernate学习笔记

    2021年11月23日
  • iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式

  • 工程师必备APP抓包技能

    工程师必备APP抓包技能奇技·指南一台上网电脑就能完成APP抓包分析一条龙服务。这是一篇APP抓包分析总结性文章,采用APP模拟器与Web调试代理工具组合玩法。从此APP抓包分析能力变得…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号