http请求中简单的签名验证
安装
安装包文件
composer require "entere/sign:v1.0.0"
使用
php 实例:
<?php require_once("./src/Sign.php");use Entere\Sign\Sign;$params = ['access_key'=>'7576762362','timestamp'=>'1439279383630','screen_name'=>'entere','format'=>'json' ]; $secret = 'f827182b1051075e601c73ac1ae329fa'; $result = Sign::generateSign($params,$secret); return $result;?>
Laravel5 实例:
<?php namespace App\Http\Controllers;use Entere\Sign\Sign;class WelcomeController extends Controller {public function index(){$params = ['access_key'=>'7576762362','timestamp'=>'1439279383630','screen_name'=>'entere','format'=>'json'];$secret = 'f827182b1051075e601c73ac1ae329fa';$result = Sign::generateSign($params,$secret);return $result;} }?>
说明
客户端与服务端的数据交互,大部分应用都采用的 RESTful API 的方式,那么如何确保 API 接口的安全性呢?URL 签名的方式可以确保请求的过程中参数不被修改。
签名的机制是由开发者在 API 客户端计算出系列参数组合的哈希值,将产生的信息添加到 URL 请求的 sign 参数。
例如 API 请求参数如下:
{"access_key":"7576762362","timestamp":"1439279383630","screen_name":"entere","format":"json" }
1、按参数名进行升序排列
access_key, timestamp, screen_name, format 其中不包括空值参数
排序后的参数为:
{"access_key":"7576762362","format":"json","screen_name":"entere","timestamp":"1438279283630",}
2、构造签名串
以secret字符串开头,追加排序后参数名称和值,格式:
secretkey1value1key2value2...
假设 secret的值为 f827182b1051075e601c73ac1ae329fa
应用到上述示例得到签名串为:
f827182b1051075e601c73ac1ae329faaccess_key7576762362formatjsonscreen_nameenteretimestamp1438279283630
3、计算签名
对上面的签名串进行 md5 签名:
md5(f827182b1051075e601c73ac1ae329faaccess_key7576762362formatjsonscreen_nameenteretimestamp1438279283630)
并把值转成小写:
927c0fc11caaf98840ed7773b348685c
4、添加签名
将计算的签名值以 sign 参数名,附加到 URL 请求中。一个典型的 API 请求如下所示
https://xxx.com/xxx?access_key=7576762362&format=json&screen_name=entere×tamp=1438279283630&sign=927c0fc11caaf98840ed7773b348685c
5、服务器验证
验证请求者的身份:简单判断 access_key。
防止重放攻击:服务器端首先验证时间戳 timestamp 是否有效,比如是服务器时间戳 5 分钟之前的请求视为无效。
保护传输中的数据:服务端收到请求时,将基于相同签名方法(去掉 sign 参数)重新计算哈希,并将其与请求中包括的哈希值进行匹配。如果哈希值不匹配,服务器将返回 401(未授权被拒绝)错误码。
License
MIT
http请求中简单的签名验证相关推荐
- postman简单教程,如何在请求中引用上次请求返回的值
做接口测试,一定会遇到这种情况,需要拿上次请求的值在本次请求中使用,比如,我们去测试一个东西,要去登录才能做其他的操作,需要拿到登录返回数据中的某些字段,比如,token啊等... 如果发一次请求,就 ...
- Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)
二.跨域: 回到顶部 跨域知识介绍: 点我以前博客 跨域解决方法:CORS:跨域资源共享 CORS请求分类(简单请求和非简单请求) 简单请求(simple request):只需要在头信息之中增加一个 ...
- Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(一)
阅读目录 一.Django中的缓存: 前戏: Django中的几种缓存方式: Django中的缓存应用: 二.跨域: 跨域知识介绍: CORS请求分类(简单请求和非简单请求) 示例: 三.自动生成接口 ...
- 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]
时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johnsonj ...
- Web请求响应简单整理
简单对Web请求响应如何处理进行的整理,难免有理解不到位,理解有偏差的地方,如有理解有误的地方,希望大牛批评指正. 1.Web开发的定义 首先看看微软对Web开发的定义: Web开发是一个指代网页或网 ...
- Web容器自动对HTTP请求中参数进行URLDecode处理
这篇文章转载自 : Web容器自动对HTTP请求中参数进行URLDecode处理 如题,在Java中也许很多人都没有注意到当我们发送一个http请求时,如果附带的参数被URLEncode之后,到达we ...
- 详细记录如何在跨域请求中携带cookie
1. 搭建环境 1.生成工程文件 npm init 2.安装 express npm i express --save 3.新增app1.js,开启服务器1 端口:3001 const express ...
- 程序员过关斩将--Http请求中如何保持状态?
微信搜一搜 架构师修行之路 这是一个被无数程序员撸过的问题,却只有少数人了解了真相.大体上搜了一下,网上关于http协议保持状态误导大家的文章还是有的,比如:有人说利用ViewState,那是asp. ...
- Nodejs教程09:实现一个带接口请求的简单服务器
示例代码请访问我的GitHub: github.com/chencl1986/- 带接口请求的简单服务器需求 虽然当前还未涉及到数据库的知识,但已经可以通过文件读写,实现一个简单的服务器,需求如下: ...
- 使用jQuery在AJAX请求中添加标头
本文翻译自:Add header in AJAX request with jQuery I would like to add a custom header to an AJAX POST req ...
最新文章
- 【电子信息复试】考研复试常考问题——组成原理
- 浏览器打开出现证书错误_PADI 电子潜水证书更新啦!
- Andriod动态布局
- CodeForces 468 CHack it!
- 12、箱形图和小提琴图的绘制
- 如何批量将多个 Txt、Json、Html 以及记事本等文本文档快速合并成一个文档
- php 获取xlsx,PHP Excel Reader读取xlsx文件
- 微型计算机原理与接口技术第三版答案
- 解决小程序view之间默认的空隙
- python中的英文歌_Python 爬网易音乐云歌曲,MV
- 团队协助 开源项目_Open Atrium 是一套开源的团队协作和知识管理系统
- 【CAD.Net】基础课程 AutoCAD 中的凸度,求圆弧的圆心、起始角度、圆弧的中心点
- 在Xshell上下载vim
- Redis集群之多主多从
- python手机编译器怎么编写程序_怎么用手机编写Python程序?
- GitHub 前 CTO:全面微服务是最大的架构错误!网友:这不是刚改完吗...
- 最早的计算机就是智慧的中国人发明的什么,美国人:这个人类使用了百年的科技,中国人居然说是他们发明的?...
- HTML 微信 获取微信ID,关于微信订阅号获取openid的问题_html/css_WEB-ITnose
- python怎么取小数点_Python如何取小数点位数
- 运行fis3 server start --type smarty启动时,报错The “data“ argument must be of type string or an instance of