PS:原创文章,如需转载,请注明出处,谢谢!
本文地址:https://www.iteye.com/blog/flyer0126-2512379
今天一同事沟通接口服务签名问题,特整理了一下,便于他人查阅。
一、为什么要签名?
接口服务需要解决的三个问题
- 请求是否合法:是否是我的信任方
- 请求是否被篡改:是否被第三方劫持并篡改参数
- 防止重复请求(防重放):是否重复请求
二、签名生成规则
那么数据保有方为了控制调用权限,会为应用端分配唯一的appKey 、 appSecert和预定义的加密方式。
- appKey :为保证该调用请求是服务方认可的调用方发出的,保证请求方唯一性(如 test01,如果发现 appKey 不再注册库中则认为该请求方不合法)
- appSecert :增加暴力解密的难度(通常是一段密文,如 SECERT_A)
- 预定义加密方式:双方约定好的加密方式(一般为散列非可逆加密,如 MD5、SHA1)
ok,我们设定签名设成规则:
1)将 APPKey 加入值请求参数
http://www.sample.com/openapi/getmessage?appKey=test01&name=spiderman&movie=Spider-Man:Homecoming
2)将每个请求参数去除“=”,按ASCII升序按“参数1参数值1参数2参数值2……”的格式组成特定的字符串
appKeytest01movieSpiderManHomecomingnamespiderman
3)将秘钥SECERT_A加入上述字符串的前后成为
SECERT_AappKeytest01movieSpiderManHomecomingnamespidermanSECERT_A
4)按约定方式(如 md5)加密:2995c83bbc12b147c9b5645396e5700e6af92b7f
5)拼接所有参数,组成API请求
第4步生成的字符串,就是我们的签名sign,也作为一个查询参数加入到我们的请求中那么请求就变成了:
www.sample.com/openapi/getmessage?name=spiderman&movie=Spider-Man:Homecoming&sign=2995c83bbc12b147c9b5645396e5700e6af92b7f
平台服务器在接到这个请求之后,会将请求包中的所有参数按以上相同的方式进行加密。如果生成的参数签名一致,则签名通过,请求的合法性和请求参数都得到保护,不会被第三方劫持后篡改变为它用。
三、签名中是否需要时间戳
签名的时间戳是防重放(重复请求)的, 只要有个过期时间就好了,例如1分钟过期。
可以利用的签名生成规则:参数字典序排序+时间戳+密钥,然后md5
注意:服务器端生成的签名不是用的服务器时间, 是用的客户端给过来的时间参数(防止时间戳获取不同源)
四、总结
按照以上的签名规则,最重要的秘钥是 appSecert,是每个调用方打死也不能告诉他人的参数,因为它不参与通讯,仅仅作为请求端和服务端两方知道的秘钥保证签名的唯一性。当然了有些平台也提供 IP 白名单服务,可以进一步防止Open API 被冒用。
相关推荐
http Restful API接签名验证 ,防API接口进行在公网裸奔
WebApi安全性 使用TOKEN+签名验证
WebApi token+签名认证的主要原理是:1.做一个认证服务,提供一个认证的webapi,用户先访问它获取对应的token 2.用户拿着相应的token以及请求的参数和服务器端提供的签名算法计算出签名后再去访问指定的api 3....
Api签名验证样例
WebAPI:client客户端post提交签名数据/apiServer服务端返回json数据交互 客户端: Web/ApiClient/queryToken.aspx API服务端:Web/Api/ApiServe/queryToken.aspx 客户端(Web/ApiClient/queryToken.aspx )以post方式...
Golang HttpAPI签名验证工具包,提供对API请求的签名生成、签名校验等工具类
用API验证数字签名,需要下载jedi api library。下载地址:http://sourceforge.net/projects/jedi-apilib/files/
API接口生成签名与验证签名思路,本文只提供生成签名的思路和验证签名的思路,不喜勿碰
阿里云API 签名机制(C#) 解决SignatureDoesNotMatch错误
PHP开发的UDID全自动签名工具源码 支持任何api签名 不掉证书 支持重签 程序对接内测侠 内附安装说明 源码全开源无加密无授权 修复已知BUG 增加定制页面查看软件详细 增加签名权限 优化定制页面 完善应用信息后台...
• 基本加密函数:用于选择CSP、建立CSP连接、...• 简单消息函数:用于消息处理,比如消息编码/解码、消息加/解密、数字签名及签名验证等操作。它是把多个底层消息函数包装在一起以完成某个特定任务,方便用户的使用。
api接口token签名与认证demo
PHP 开发的 UDID 全自动签名工具源码 支持任何 api 签名 不掉证书 支持重签 程序对接内测侠 内附安装说明 源码全开源无加密无授权 修复已知 BUG 增加定制页面查看软件详细 增加签名权限 优化定制页面 完善应用信息...
本文整理了如何使用CryptoAPI 操作ukey进行数字签名。附上流程和部分代码,讲解cryptoapi实际应用以及应用中关键问题的解决方法,在这里,仅介绍数字签名(加密流程类似,但是,操作略有不同,所需要的函数也不同),...
Delphi使用CryptoAPI生成自签名证书,PHP端使用该证书进行签名,Delphi作为客户端使用公钥进行验签。
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
1.使用wincrypt签名文件 2.使用wincrypt验证文件
关于阿里云物联网云平台开放接口调用时API签名值计算,官方有JAVA、.net等教程,但是没有js计算签名值。适用于小程序。