laya 怎么生成签名_PHP开发API接口签名生成及验证

开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证。

我们在设计签名验证的时候,请注意要满足以下几点:

可变性:每次的签名必须是不一样的。

时效性:每次请求的时效,过期作废等。

唯一性:每次的签名是唯一的。

完整性:能够对传入数据进行验证,防止篡改。

一、签名参数sign生成的方法

第1步: 将所有参数(注意是所有参数),除去sign本身,以及值是空的参数,按参数名字母升序排序。

第2步: 然后把排序后的参数按参数1值1参数2值2…参数n值n(这里的参数和值必须是传输参数的原始值,不能是经过处理的,如不能将"转成”后再拼接)的方式拼接成一个字符串。

第3步: 把分配给接入方的验证密钥key拼接在第2步得到的字符串前面。

第2步: 在上一步得到的字符串前面加上验证密钥key(这里的密钥key是接口提供方分配给接口接入方的),然后计算md5值,得到32位字符串,然后转成大写.

第4步: 计算第3步字符串的md5值(32位),然后转成大写,得到的字符串作为sign的值。

举例:

假设传输的数据是/interface.php?sign=sign_value&p2=v2& p1=v1&method=cancel&p3=&pn=vn(实际情况最好是通过post方式发送),其中sign参数对应的sign_value就是签名的值。

第一步,拼接字符串,首先去除sign参数本身,然后去除值是空的参数p3,剩下p2=v2&p1=v1&method=cancel& amp;pn=vn,然后按参数名字符升序排序,method=cancel&p1=v1&p2=v2&pn=vn.

第二步,然后做参数名和值的拼接,最后得到methodcancelp1v1p2v2pnvn

第三步,在上面拼接得到的字符串前加上验证密钥key,我们假设是abc,得到新的字符串abcmethodcancelp1v1p2v2pnvn

第四步,然后将这个字符串进行md5计算,假设得到的是abcdef,然后转为大写,得到ABCDEF这个值即为sign签名值。

注意,计算md5之前请确保接口与接入方的字符串编码一致,如统一使用utf-8编码或者GBK编码,如果编码方式不一致则计算出来的签名会校验失败。

二、签名验证方法:

根据前面描述的签名参数sign生成的方法规则,计算得到参数的签名值,和参数中通知过来的sign对应的参数值进行对比,如果是一致的,那么就校验通过,如果不一致,说明参数被修改过。

三、下面直接看代码

// 设置一个公钥(key)和私钥(secret),公钥用于区分用户,私钥加密数据,不能公开

$key = "c4ca4238a0b923820dcc509a6f75849b";

$secret = "28c8edde3d61a0411511d3b1866f0636";

// 待发送的数据包

$data = array('username' => 'abc@qq.com',

'sex' => '1',

'age' => '16',

'addr' => 'guangzhou',

'key' => $key,

'timestamp' => time(),

);

// 获取sign

function getSign($secret, $data) {// 对数组的值按key排序

ksort($data);

// 生成url的形式

$params = http_build_query($data);

// 生成sign

$sign = md5($params . $secret);

return $sign;

}

// 发送的数据加上sign

$data['sign'] = getSign($secret, $data);

/**后台验证sign是否合法

@param [type] $secret [description]

@param [type] $data [description]

@return [type] [description]

*/

function verifySign($secret, $data) {// 验证参数中是否有签名

if (!isset($data['sign']) || !$data['sign']) {

echo '发送的数据签名不存在';

die();

}

if (!isset($data['timestamp']) || !$data['timestamp']) {

echo '发送的数据参数不合法';

die();

}

// 验证请求, 10分钟失效

if (time() - $data['timestamp'] > 600) {

echo '验证失效, 请重新发送请求';

die();

}

$sign = $data['sign'];

unset($data['sign']);

ksort($data);

$params = http_build_query($data);

// $secret是通过key在api的数据库中查询得到

$sign2 = md5($params . $secret);

if ($sign == $sign2) {

die('验证通过');

} else {

die('请求不合法');

}

}

?>本文由博客群发一文多发等运营工具平台 OpenWrite 发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?

咨询区 Theyouthis:最近我将项目升级到 .NET Core 3 之后,我发现自带的 System.Text.Json.JsonSerializer 序列化器有一个奇葩的问题,它不支持对 类字段 的序列化。。。参考如下代码:namespace ConsoleApp6 {class Program{static…

Windows下MinGW编译vim7.4

学习了一段时间Vim,感觉有些功能真的很方便。因学习原因,工作平台更换到一台老式Xp电脑上,重新安装了Vim7.4。官网默认版本不支持等宽字体和GDI渲染,需要手工编译一个修改过的版本。 1、下载MinGW 直接从MinGW官网下载的是在线安装…

告别 ROR windows 部署的噩梦-在 windows 上面 使用 Apache 部署 Ruby On Rails

今天去赛博把给朋友做的网站部署一下,服务器是一台windows2003的服务器。本身没想到在windows2003上面配置 ROR 是一场噩梦,因为网上看到了很多的 IIS 和 ROR 文档。不做不知道,一做才知道那简直是噩梦。忙到下午5点多还是没有配置好&#xf…

除了中国,原来还有这么多国家采用十二生肖的啊~| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅一、肥宅快乐水(qiu?)A岛-匿名版二、永远不轻言放弃知识冷知识青年 图片五目马丁饭三、终于知道怎么倒立问了冷知识日报社四、千万不能浪费文医疗音乐手绘君五、世界上所有采用十二生肖的国家冷知识日…

命中率_数据说话!詹姆斯的“皇家射手团”命中率为近十年最低

北京时间10月13日,湖人球员丹尼格林更新个人社交媒体,发布自己与奥布莱恩杯的合影等,并配文“随你怎么说,我又多了一样你拿不走的东西”。格林晒出自己与杜德利、詹姆斯的合影。此前,格林因为在NBA总决赛G5中未能命中极…

.net core 微服务下的手工签名实现,以及消除中文乱码

最近在实现一款业主签字的需求,签字前端由vue下的某个共享组件实现,其采用Canvas绘图方式实现签名图片的生成,后台主要提供签名前文档的呈现,以及签名后文件合成过的签名文档保存。FastReport报表生成器FastReport .NET是适用于.N…

高性能通道

高性能通道 http://detail.1688.com/offer/896868540.html https://www.datastoragecables.com/qsfp/qsfp-qsfp/qsfp-qsfp-ib/C9494-M-IB.html【infiniband】 http://pkg-ofed.alioth.debian.org/howto/infiniband-howto.html#toc6【infiniband-ib】posted on 2013-10-28 21:26…

清华学霸直博简历火了!CPU、操作系统、编译器全自主写,刘知远点赞

全世界只有3.14 % 的人关注了青少年数学之旅清华大学直博面试的一则简历上了知乎热榜:“实现了在自己写的CPU上运行自己写的操作系统,以及自己实现的编译器生成的程序”。简历主人是清华计算机系本科生周聿浩同学,他顺利拿到直博名额&#xf…

mysql索引有几种使用索引的好处_mysql索引的类型和优缺点

mysql索引的类型和优缺点索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。注:[1]索引不是万能的!索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录…

使用Blazor开发内部后台(一):认识Blazor

转载技术社区中一位朋友最新的文章,介绍自己为公司的 WebForm 遗留系统使用 Blazor 重写前端 UI 的经历。前言啊,又好久没写文章了,这一年一直在接触新的领域,扩展了一下技术面,学了很多新东西。前阵子发现公司内部有个…

[新手学go]关于go语言中的变量重复声明

代码一: package mainimport ("fmt" )func main() {a,b :1,2 a,b : 3,4fmt.Println(a, b) } 代码二: package mainimport ("fmt" )func main() {a, b : 1, 2k, b : 3, 4fmt.Println(a, b, k) //1,4,2 } 代码…

全球科技界最鼓舞人心领袖揭晓!马斯克第一,马云第五

全世界只有3.14 % 的人关注了青少年数学之旅谁是科技界最鼓舞人心的领袖?最近技术招聘网站Hired对3600多名技术人员进行了调查,最终马斯克击败贝佐斯、纳德拉、扎克伯格等人成功当选,马云排名第五。SpaceX被评为全球私人公司中第二大最受欢迎…

设置mysql表myisam_mysql myisam 优化设置设置

mysql myisam 优化设置设置更新时间:2010年03月16日 21:28:24 作者:mysql myisam 优化设置设置,需要的朋友可以参考下。myisam_max_[extra]_sort_file_size足够大delay_key_write减少io,提高写入性能bulk_insert_buffer_sizeconcurrent_ins…

隐藏文件始终不能显示的完美解决方法

我的电脑"——“工具”——“文件夹选项”——设置“显示所有文件和文件夹”后,系统仍然自动设置为“不显示隐藏的文件和文件夹”,无法看到隐藏文件。解决方法: 打开注册表hkey_local_machine\softwaer\microsoft\windows\currentversio…

NET问答: 为什么 String.IndexOf 在 .net5 和 netcore3 中返回值不一样?

咨询区 Farhad Zamani:当我在 .NET Core 3.1 中运行下面代码的时候,程序会返回 6。class Program{static void Main(string[] args){// .NET Core 3.1string s "Hello\r\nworld!";int idx s.IndexOf("\n");Console.WriteLine(idx)…

vSpere虚拟网卡介绍

在一个物理网络拓扑中,通常都是路由器-交换机-PC机的连接,不同的服务器和PC机,通过交换机的连接而相互连通。在VMwarevSphere架构下服务器会虚拟出交换机来供ESXHost虚拟机来使用,虚拟交换机有两种,vSwitch虚拟交换机和…

快速掌握MATLAB应用,只要从这一步开始!

有人说,“MATLAB除了不会生孩子,什么都会。”矩阵运算、数据可视化、GUI(用户界面)设计、甚至是连接其他编程语言,MATLAB都能轻松实现!那么,MATLAB到底有多厉害?MATLAB拥有丰富的算法…

如何查看 .NET Core 3.1 源代码

背景在 .NET 走向开源后,我们可以方便的查看 .NET 内部的实现方式,学习和寻找问题,甚至参与到 .NET 的开发中。前段时间,同事需要查看 C# 的 Task 类 (System.Threading.Tasks) 的一些实现和内部的原理,想找 Task 类的…

也感山西黑窑洞

也感山西黑窑洞——代腾飞 2007年6月21日 于成都黑窑奴工十年痛屠龙刀下敢不从朗朗乾坤岂纵容敢问苍天谁枭雄转载于:https://www.cnblogs.com/daitengfei/archive/2007/06/22/792794.html

tcl mysql_MySQL·TCL语言

TCL语言就是我们所说的事务控制语言。首先事务的定义就是:一条或者多条SQL语句所组成的一个执行单位,且该组sql语句要么执行要么都不执行。事务有四大特性(ACID),分别为:(1).原子性(A):一个事务是不可再分割的整体&…