api接口验证shal()
就安全来说,所有客户端和服务器端的通信内容应该都要通过加密通道(HTTPS)传输,明文的HTTP通道将会是man-in-the- middle及其各种变种攻击的温床。所谓man-in-the-middle攻击简单讲就是指恶意的黑客可以在客户端和服务器端的明文通信通道上做手 脚,黑客可以监听通信内容,偷取机密信息,甚至可以篡改通信内容,而通过加密后的通信内容理论上是无法被破译的。
URL签名生成规则
|
API的有效访问URL包括以下三个部分: |
签名算法如下:
|
1. 对所有请求参数进行字典升序排列; |
注意:请保证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;
}

api接口验证shal()的更多相关文章
- 分享api接口验证模块
一.前言 权限验证在开发中是经常遇到的,通常也是封装好的模块,如果我们是使用者,通常指需要一个标记特性或者配置一下就可以完成,但实际里面还是有许多东西值得我们去探究.有时候我们也会用一些开源的权限验证 ...
- API接口验证
一.前言 权限验证在开发中是经常遇到的,通常也是封装好的模块,如果我们是使用者,通常指需要一个标记特性或者配置一下就可以完成,但实际里面还是有许多东西值得我们去探究.有时候我们也会用一些开源的权限验证 ...
- ASP.NET MVC API 接口验证
项目中有一个留言消息接口,接收其他系统的留言和展示留言,参考了网上的一些API验证方法,发现使用通用权限管理系统提供的验证方法最完美(http://www.cnblogs.com/jirigala/p ...
- 手机端API接口验证及参数签名验证
问题背景: 后端服务对手机APP端开放API,没有基本的校验就是裸奔,别人抓取接口后容易恶意请求,不要求严格的做的安全,但是简单的基础安全屏障是要建立的,再配合HTTPS使用,这样使后端服务尽可能的安 ...
- API接口防止参数篡改和重放攻击
{近期领导要求我对公司业务的支付类的ocr接口做研究,是否存在支付接口重放攻击,so.....} API重放攻击(Replay Attacks)又称重播攻击.回放攻击.他的原理就是把之前窃听到的数据原 ...
- spring boot 2 集成JWT实现api接口认证
JSON Web Token(JWT)是目前流行的跨域身份验证解决方案.官网:https://jwt.io/本文使用spring boot 2 集成JWT实现api接口验证. 一.JWT的数据结构 J ...
- Web API接口 安全验证
在上篇随笔<Web API应用架构设计分析(1)>,我对Web API的各种应用架构进行了概括性的分析和设计,Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端 ...
- PHP开发api接口安全验证
php的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道 ...
- PHP开发api接口安全验证方法一
前台想要调用接口,需要使用几个参数生成签名.时间戳:当前时间随机数:随机生成的随机数 签名:特定方法生成的sign签名 算法规则在前后台交互中,算法规则是非常重要的,前后台都要通过算法规则计算出签名, ...
随机推荐
- 一维码生成 c# winform GUI
最近看到同事小红在做一维码,感觉挺好玩,于是就在网上找了一个例子来玩玩. 下面的代码均为网上的代码,做了一些整理,但是忘记了出处,原作者看到可以提醒我,谢谢. 首先,一维码的相关知识可以先百度一下:h ...
- 用springMVC构建restful程序,接收以及返回json数据格式
主要参考文章:http://kingxss.iteye.com/blog/1487745和http://blog.csdn.net/greensurfer/article/details/192962 ...
- java集合类的学习(一)
为何要用集合类:可以储存不同类型的数据,可以进行动态的删除和修改,不用考虑数组越界的问题. 软件开发常用的集合类:Vector,ArrayList,Stack,HashMap,Hashtable. 3 ...
- Exchange 基本命令累计
Get-ExchangeServer | fl name,edition,admindisplayversion //查看exchange服务器版本
- javascript之小积累-匿名函数表达式的最佳实践
在写js的时候,还是经常会用的匿名函数表达式,比如 setTimeout(function() { console.log(110); }, 1000); 上面那个function()就是匿名函数表达 ...
- web页面放到手机页面,缩放问题
有时候写页面样式不规范,很多页面元素写死尺寸时,web页面尺寸比较大放到移动端访问时,就背缩放了,div或者按钮变得好小 可以加段js,效果会好点 <script> ! function( ...
- 深入了解C#中的静态变量和静态构造函数
深入的剖析C#中静态变量和静态构造函数: 在日常的程序开发过程经常会使用到静态变量,众所周知,静态变量时常驻内存的变量,它的生命周期是从初始化开始一直到Application结束.但是,我们经常会忽略 ...
- [翻译]Primer on Cognitive Computing(认知计算入门)
Source Kelly J., Primer on Cognitive Computing 20150216. 侵删,联系方式:zhoujiagen\@gmail.com. 按A candidate ...
- 如何制作快速加载的HTML页面
整理出来的tip 减小页面的大小 在页面下载中,页面的大小至今扮演着非常重要的因素. 减小页面的大小能够通过排除不必要空格,注释,动态内嵌脚本,和放入外部文件的 CSS 等在页面结构中很小的改变都能够 ...
- debug不过的程序
下面的程序debug是不能通过的. 至于为什么我还不知道. assume cs:codesg codesg segment start: mov ax,2000h mov ss, ax mov sp, ...