php 中文key_API常用签名验证方法(PHP实现)
php中文网最新课程
每日17点准时技术干货分享
本文为php中文网认证作者:“安安杰尼”投稿,欢迎加入php中文网有偿投稿计划!
使用场景
现在越来越多的项目使用的前后端分离的模式进行开发,后端开发人员使用API接口传递数据给到前端开发进行处理展示,在一些比较重要的修改数据接口,涉及金钱,用户信息等修改的接口如果不做防护验证,经常容易被人恶意刷接口,导致巨大的损失。
API签名验证
这里我们引入业内比较通用的签名验证来对接口进行参数加密,有以下优势。
请求的唯一性:计算出的签名是唯一的,可以用来验证。
参数的可变性:参数中包含时间戳参数,这就保证每次的请求计算出得签名都是不一样的。
请求的时效:由于请求中带有当前发起请求的时间戳参数,服务端可以对时间戳进行验证,过滤超出时效的请求。
安全性:即使请求被人恶意抓包,对方恶意篡改其中的参数,那么签名都是错误的,参数无法修改。
实践出真理
1. 对map类型(即一组键值对)的待签名数据根据键的大小进行排序。map中各参数按字母顺序排序,如果第一个字母相同,按第二个字母排序,依次类推。例如
{ "timestamp": "2017-06-08 09:38:00", "format": "xml", "app_id": "aabbc", "cp_extend_info": "", "sign_type": "HMAC-SHA1", "sign": "abc"}
那么,排序后变成
{ "app_id": "aabbc", "cp_extend_info": "", "format": "xml", "sign_type": "HMAC-SHA1", "timestamp": "2017-06-08 09:38:00"}
注意:如果map中包含签名的参数(sign)需要过滤该参数的键值不参与签名,没有值的参数请不要参与签名
2. 对排序后的map进行序列化处理成待签名字符串,拼接后的待签名字符串为
app_id=aabbc&format=xml&sign_type=HMAC-SHA1×tamp=2017-06-08 09:38:00
3. 根据HMAC-SHA1算法使用密钥提取待签名字符串的摘要(hash)签名并进行base64_encode编码(便于显性传输和对比),假设签名密钥为 test ,则提取出的摘要签名并进行base64_encode的值为
JqoEqPIVVor0eyRHMYiZftsycVo=
注意:由于有些数据根据HTTP协议需求,在网络传输过程中需要进行URLencoding,这样接收方才可以接收到正确的参数,但如果这个参数参与签名,那么待签名字符串必须是字符串原值而非URLencoding 的值。
代码实践
PHP示例
/** * 使用密钥生成HMAC-Sha1签名 * @param array $params 请求参数 * @param string $signKey 签名密钥 * @return string */function hmacSha1Sign($params,$signKey){ ksort($params); $paramString = ''; foreach ($params as $key => $value) { if (is_null($value) || $value=='' || $key == 'sign') { continue; } $paramString .= $key.'='.$value.'&'; } $paramString = substr($paramString,0,-1); $sign = base64_encode(hash_hmac("sha1", $paramString, $signKey, $raw_output=TRUE)); return $sign;}
▼
php 中文key_API常用签名验证方法(PHP实现)相关推荐
- php api接口验证签名错误,API常用签名验证方法(PHP实现)
使用场景 现在越来越多的项目使用的前后端分离的模式进行开发,后端开发人员使用API接口传递数据给到前端开发进行处理展示,在一些比较重要的修改数据接口,涉及金钱,用户信息等修改的接口如果不做防护验证,经 ...
- 使用TkMybatis逆向生成带中文注释文件,并使用其常用的方法
首先说明,博主用的是springboot,如使用原生态的mybatis的一些配置文件请自行百度 贴上pom文件 <?xml version="1.0" encoding=&q ...
- php utf-8读取,PHP读取文件,解决中文乱码UTF-8的方法分析
PHP读取文件,解决中文乱码UTF-8的方法分析,方法,中文,操作技巧,文本,本文 PHP读取文件,解决中文乱码UTF-8的方法分析 易采站长站,站长之家为您整理了PHP读取文件,解决中文乱码UTF- ...
- mysql脚本执行中文乱码_MySQL从命令行导入SQL脚本时出现中文乱码的解决方法
本文实例讲述了MySQL从命令行导入SQL脚本时出现中文乱码的解决方法.分享给大家供大家参考,具体如下: 在图形界面管理工具 MySql Query Browser中打开脚本(脚本包括建库.建表.添加 ...
- MyEclipse常用设置方法
MyEclipse常用设置方法 MyEclipse作为Eclipse的一款插件迅速"走红",为当今企业的开发J2EE项目的首选IDE. 用MyEclipse不久,但在这不久的时间内 ...
- iOS开发中常用的方法
iOS开发中常用的方法 系统弹窗: 过期方法: UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"确认报价" ...
- 前端JS常用工具方法
前端JS常用工具方法 // var ua = window.navigator.userAgent.toLowerCase(); /*** 前端JS常用工具方法* @class Tools*/ exp ...
- 结合语言知识和深度学习的中文文本情感分析方法
结合语言知识和深度学习的中文文本情感分析方法 徐康庭, 宋威 北方工业大学信息学院 摘要:在目前的中文文本情感分析研究中,基于语义规则和情感词典的方法通常需要人工设置情感阈值:而基于深度学习的方法由于 ...
- Java | Java常用API方法总结
Java常用API方法总结 常用API JavaAPI 1 java.lang String StringBuilder Integer parseXxx Math Object System Thr ...
最新文章
- Android Activity的launchMode四种启动模式备忘
- vue-cli ——解决多次复用含有Echarts图表组件的问题
- Halcon算子知识:optical_flow_mg
- mysql 视图怎么调用方法_mysql 视图的使用
- 77 行代码实现 ABAP ALV 中的双击事件处理
- Cloud for Customer UI designer自动生成的一些模型
- SQL语句中的TOP(expression) [PERCENT] [WITH TIES] 用法
- Windows2003开机后进不了系统
- MySQL 数据查询
- plcst语言编程教程_ST 结构文本 PLC编程语言 教程.pdf
- 字体引起的用户密码错误
- 【Python】一键爬取金庸连载版/三联版/世纪新修版小说
- 地址总线是单向还是双向_「计算机组成原理」:总线、地址总线、数据总线和控制总线...
- Make sure that libnvrtc-builtins.so.11.1 is installed correctly.
- 网页打开速度慢,如何解决(修改DNS)
- [阿毛]Ubuntu 16安装CH340串口驱动
- 快速串联 RNN / LSTM / Attention / transformer / BERT / GPT
- 毕业论文写作中数据获取与查询
- 针对Intel芯片mac、win平台对cpu功耗、频率、电源等信息检测
- 机器人主板需求配置参数有哪些呢?
热门文章
- 消息中间件学习总结(4)——RocketMQ之RocketMQ 迈入50万TPS消息俱乐部
- Maven学习总结(35)——Maven项目错误 JAX-RS (REST Web Services) 2.0 can not be installed问题...
- Java Web学习总结(33)——Java Web 程序员如何转型大数据
- java中为什么需要常量和变量的区别_Java中常量和最终变量之间的区别?
- mysql的两种存储方法_mysql的两种存储引擎
- SpringBoot 开启关闭自动任务配置(EnableScheduling )
- 一个资深系统管理员的O2O实践(三)
- Eclipse自动生成作者、日期注释功能设置
- 献策企业:制定优秀移动化企业七步骤
- 2728:摘花生(数字金子塔变形)