API接口签名验证

2023-10-29

系统从外部获取数据时,通常采用API接口调用的方式来实现。请求方和接口提供方之间的通信过程,有这几个问题需要考虑:

1、请求参数是否被篡改;

2、请求来源是否合法;

3、请求是否具有唯一性。

今天跟大家探讨一下主流的通信安全解决方案。

参数签名方式

这种方式是主流。它要求调用方按照约定好的算法生成签名字符串,作为请求的一部分,接口提供方验算签名即可知是否合法。步骤通常如下:

①接口提供方给出appid和appsecret

②调用方根据appid和appsecret以及请求参数,按照一定算法生成签名sign

③接口提供方验证签名

生成签名的步骤如下:

①将所有业务请求参数按字母先后顺序排序

②参数名称和参数值链接成一个字符串A

③在字符串A的首尾加上appsecret组成一个新字符串B

④对字符串进行md5得到签名sign

假设请求的参数为:f=1,b=23,k=33,排序后为b=23,f=1,k=33,参数名和参数值链接后为b23f1k33,首尾加上appsecret后md5:
md5(secretkey1value1key2value2...secret)。

签名的php版本实现:

    public static function sign($appSecret, $params) {
    if (!is_array($params)) 
        $params = array();

    ksort($params);
    $text = '';
    foreach ($params as $k => $v) {
        $text .= $k . $v;
    }

    return md5($appSecret . $text . $appSecret);
}

接口调用方的请求地址类似于:

/api/?f=1&b=23&k=33&sign=signValue

以上签名方法安全有效�地解决了参数被篡改和身份验证的问题,如果参数被篡改,没事,因为别人无法知道appsecret,也就无法重新生成新的sign。

这里使用了md5的算法进行签名,也可以自行选择其他签名方式,例如RSA,SHA等。

另外,多说一句,微信公众号开发时,验证服务器地址的有效性也采用了类似的方法,只是生成签名的方法不一样。

请求唯一性保证

md5签名方法可以保证来源及请求参数的合法性,但是请求链接一旦泄露,可以反复请求,对于某些拉取数据的接口来说并不是一件好事,相当于是泄露了数据。

在请求中带上时间戳,并且把时间戳也作为签名的一部分,在接口提供方对时间戳进行验证,只允许一定时间范围内的请求,例如1分钟。因为请求方和接口提供方的服务器可能存在一定的时间误差,建议时间戳误差在5分钟内比较合适。允许的时间误差越大,链接的有效期就越长,请求唯一性的保证就越弱。所以需要在两者之间衡量。

秘钥的保存

在签名的过程中,起到决定性作用之一的是appsecret,因此如何保存成为关键。我们分类讨论。

接口调用方的代码跑在服务器的情况比较好办,除非服务器被攻陷,否则外接无法知道appsecret,当然,要注意不能往日志里写入appsecret的值,其他敏感值也禁止写入日志,如账号密码等信息。

假如是客户端请求接口,就需要多想一步了。假如把appsecret硬编码到客户端,会有反编译的风险,特别是android。可以在客户端登陆验证成功后,返回给客户端的信息中带上appsecret(当然,返回的数据也可能被拦截,真是防不胜防啊。。。)。特别说明一下,在android开发中,假如硬要把appsecret硬编码,建议把appsecret放到NDK中编译成so文件,app启动后去读取。

TOTP:Time-based One-time Password Algorithm(基于时间的一次性密码算法)

在一些小型项目中,可能不需要复杂的签名校验,只需要做调用方的身份验证。TOTP(rfc6238)即可满足。

TOTP是基于时间的一次性算法,客户端和服务器端约定秘钥,加入时间作为运算因子得到一个6位数字。客户端请求服务端时生成一个6位数字,服务端使用相同算法验证这个6位数字是否合法。

下面再展开一下讨论,跟本文讨论的主题关系不大。

TOTP允许客户端和服务器端存在时间误差,如口令在N分钟内有效。给出一下源码供大家参考:

与TOTP类似的还有 HTOP,它是基于次数的验证算法。这里不展开讨论。

TOTP流程

基于TOTP还有很多应用,例如动态的登录口令。用户登录时,除了需要输入设置的密码外,还需要输入动态密码,每个用户的秘钥都不一样,用户的手机端安装一个app即可实现,动态口令每N分钟变化一次。android客户端在各大应用市场搜索 google-authenticator,如 百度应用市场,ios客户端在appstore也可搜索得到。下面给出部分下载链接:

支付宝、QQ令牌、银行客户端等这些手机客户端中也有类似的应用,在验证密码之后会多出一道动态口令的验证,他们使用的方案都类似于google-authenticator。

大公司的运维人员,甚至是所有员工登录内部OA系统(单点登录),都需要PIN+令牌码的双重验证(PIN是自行设置的固定密码,令牌码则是动态口令码),他们通常使用RSA SecurID双因素动态口令身份认证解决方案。


作者:hellojammyPlus
链接:https://www.jianshu.com/p/d47da77b6419
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

API接口签名验证 的相关文章

  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • jQuery ajax 调用包含重音字符的 url 将错误的 Uri 从 IE 发送到服务器

    我在使用 IE 发送包含重音字符的 url 时遇到问题 这是一个简单的函数 function runjQueryTest var url test Beyonc get url function 在服务器 PHP 上我记录了请求uri的值
  • Yii2 - 错误请求 (#400) |前端和后端cookie

    仅当我打开时才会出现此问题frontend and backend在相同的browser 设想 与后端交互 gt 切换选项卡 gt 与前端交互 gt 切换选项卡返回 gt 与后端交互 gt 错误请求 400 Cookie 后端 identi
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP WCF 集成

    是不是如果我想支持php客户端访问我的服务 我必须有一个基本的http端点 这是因为php仍然只支持soap 1 1吗 据我所知 自从我使用 PHP 以来已经两年了 情况仍然如此 如果客户端应用程序将使用 PHP 的内置 SoapClien
  • 您的要求无法解析为 laravel 的一组可安装软件包

    我使用 5 7v Laravel 和 7 2 1v PHP 和 Composer 最新版本 但是当我想创建新项目时出现这些错误 Your requirements could not be resolved to an installabl
  • 在哪里可以学习网络编程从入门到精通? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我尝试做教程 但它是无组织且无结构的 我在哪里可以学习 PHP 从初学者到大师 我正在寻找类似的网站w
  • 分页显示所有其他页面上第 1 页的相同帖子

    我最近在创建即将发生的事件列表时得到了很多帮助 请参阅此处显示即将举行的活动 包括今天的活动 https stackoverflow com questions 17343615 showing upcoming events includ
  • 将 cookie 设置为在当天结束时过期

    我想设置一个 cookie 并让它在一天结束时过期 这有效 但 24 小时后过期 setcookie route upgrade voted true time 86400 这不起作用 setcookie route upgrade vot
  • 使用 PHP glob 列出 FTP 服务器上的文件不起作用

    我使用此代码来访问目录 location files pictures glob location png 我想使用 FTP 访问远程路径 location opendir ftp user password host name files
  • 是否可以用 PHP 编写电子邮件解析器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • CodeIgniter:My_Lang 中的 get_instance

    我发现这个有用的国际化代码 http pastebin com SyKmPYTX http pastebin com SyKmPYTX 一切正常 除了我无法在此类中使用 CI 函数 我想从 DB 设置 languages 和 special
  • 使用PHP从doc、xls文件中读取数据

    我想知道是否可以从 doc 和 xls 文件中读取数据并将 将内容读取到图像文件中 创建文档的页面样本 例如 我有一些文件希望我的客户购买 所以我需要自动创建小图像 例如我的文档样本 我们将不胜感激您的帮助 对于读取 xls 文件 我真的推
  • php - 解析html页面

    div divbox div p para1 p p para2 p p para3 p table class table tr td td tr table p para4 p p para5 p 有人可以告诉我如何解析这个 html
  • 字符串相似度的算法(比Levenshtein和similar_text更好)? php, Js

    在哪里可以找到比 levenshtein 和 phpimilar text 方法更准确地评估错误字符的拼写的算法 Example similar text jonas xxjon similar echo similar returns 6
  • PHP 检查当前日期是在设定日期之前还是之后

    我从数据库中提取一个日期 其格式为 dd mm YYYY 我想做的是检查当前日期 如果当前日期早于数据库中的日期 则需要打印数据库日期 如果是在之后 则需要打印 继续 有人能指出我正确的方向吗 if strtotime database d
  • 雄辩的第一个 where 子句

    我想知道 Laravel 如何实现雄辩的语法 以便可以静态调用第一个 where 子句User where User where id 23 gt where email email gt first 他们有吗public static f
  • 在本地 SDK 服务器上工作时,实时 Google App Engine 上出现 404

    我已经在GAE标准环境上部署了几个PHP应用程序 一切正常 现在我正在部署一个新应用程序 该应用程序位于由gcloudSDK按预期工作 终端命令 dev appserver py log level warning app yaml 问题是
  • 矩形超出边界是什么意思

    PPB Graphics2D PaintImageData 矩形超出界限是什么意思 我几乎在我检查的每一段代码中都看到了它 最新的代码是 define my consumer key define my consumer secret oa

随机推荐

  • 轻量级c语言开源日志库log.c介绍 - 实现不同级别和参数化日志打印

    前言 c语言没有现成的日志库 如果要记录日志 需要自己封装一个日志库 如果要实现日志级别和参数打印 还是比较麻烦的 正好在github找到了一个c语言开源日志库 可以实现日志级别打印 参数打印 而且还会记录日期和行号 最重要的是代码非常少
  • Google API 设计指南-文档

    翻译自 API Design Guide Documentation 这一章是为 API 添加内部文档的指南 大部分 API 有概述 教程和更高级别的参考文档 此指南不讨论 API 名 资源名和方法名的信息请查看命名约定 注释格式 在 pr
  • OpenGL ES几个概念-顶点着色器、片元着色器、EGL

    一 OpenGL ES OpenGL ES是使用在手机端和嵌入式里的3D图形应用程序编程接口 是跨平台的API OpenGL ES是OpenGL的简化版本 OpenGL2 x 版本相比 1 x 版本有较大差异 1 x 版本为 fixed f
  • Kylin Flink Cube 引擎的前世今生

    Apache Kylin 是一个开源的 分布式的分析型数据仓库 提供Hadoop Spark 之上的 SQL 查询接口及多维分析 OLAP 能力以支持超大规模数据 它能在亚秒内查询巨大的表 Kylin 的核心思想是 预计算 将数据按照指定的
  • C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理

    目录 前言 智能指针 使用方法 unique ptr 实现unique ptr类 使用uniquePtr shared ptr 实现SharedPtr 使用shared ptr weak ptr 使用weak ptr 前言 下面这段代码看起
  • Windows下同时安装python 2 和 3 详细教程 ——为了GitHack工具 同时安装python2和3的过程记录

    搜了半天发现 GitHack竟然真的只能在python2中运行 心痛 不得不去下python2 我之前下的是python3 文章目录 1 下载 安装 python2和3 2 配置python 2 x 的环境变量 3 将python 2 x
  • 投票==公平???

    前言 我们在团队中遇到意见分歧时 通常会通过投票机制以期来得到一个公平 公正的让所有人都能信服的解决方案 但是 这样的方案是否真的绝对公平 只有道德上的相对民主 没有制度上的绝对公平 求同存异才能长治久安 关于投票的经典场景 古雅典陶片放逐
  • TP-LINK交换机登录Web页面的操作方法

    TP LINK交换机登录Web页面的操作方法 之前小编介绍了TP LINK路由器登录Web管理页面的操作步骤 以及路由器无法登录的解决方法 详见文章 Tp link路由器管理界面无法登陆原因解析 下面栏目小编具体说说TP LINK交换机登录
  • Matlab设计数字滤波器入门

    一个3阶低通滤波器由下面差分方程描述 y n 0 0181 x n 0 0543 x n 1 0 0543 x n 2 0 0181 x n 3 1 76 y n 1 1 1829 y n 2 0 2781 y n 3 画出这个滤波器的幅度
  • VUE的基本使用(上)

    一 开发环境配置 VSCode 插件安装 jshint js代码规范检查 Beautify 一键美化代码的插件 Vetur vue文件识别插件 Javascript ES6 code snippets ES6语法提示 Auto Rename
  • 计算机ip保留地址,ip地址显示为保留地址怎么解决

    ip地址显示为保留地址怎么解决 2016 09 05 10 28 标签 dhcp ip地址 ip是保留地址怎么解决 ip作为计算机网络相互连接进行通信的协议 当dhcp超出系统规定的时间后 便会自动分配一个保留地址作为ip 如果主机ip地址
  • 涂鸦WIFI模组方案(MCU SDK)

    摘自涂鸦官方视频教程 https www bilibili com video BV1pb41117LD spm id from 333 999 0 0等 摘自 涂鸦IoT开发平台MCU开发接入 Wi Fi App面板 地址 https w
  • window.close()无效,原因剖析

    官方解释 https developer mozilla org en US docs Web API Window close 简单的说就是 window close 方法只能关闭由window open 或者浏览器直接输入url打开的页
  • 【敬伟ps教程】图层进阶知识

    文章目录 图层过滤和锁定 图层链接 图层编组 图层合并 图层盖印 图层复合 图层剪贴蒙版 图层过滤和锁定 图层过滤可以根据图层不同的性质进行查看管理 图层锁定即是对图层或图层某部分进行操作保护 按钮分别为 锁定透明像素 禁止对透明区域进行操
  • 使用JavaScript实现一个简单的计时器

    简介 计时器是前端开发中常见的功能之一 它可以帮助我们记录时间并进行倒计时等操作 在本篇博客中 我将向大家介绍如何使用JavaScript实现一个简单的计时器 实现步骤 第一步 创建HTML结构 首先 我们需要在HTML中创建一个用于显示计
  • 大语言模型参数说明(Temperature,Top p,Top k)

    如下是一些模型的运行界面 在使用OpenAI的接口 常常遇见一些参数 搞清它们的含义促使我们更进一步理解输出的结果 学习传送带 1 Temperature 用于调整随机从生成模型中抽样的程度 因此每次点击 生成 时 相同的提示可能会产生不同
  • app性能

    性能获取办法 appium webview context execute script perfmance api appium selenium的ExecuteScript Api 注入js return JSON stringify
  • muduo网络库学习(九)日志类Logger和LogStream,将日志信息打印到屏幕

    每一个成熟的项目都有大大小小的日志系统 在关键的地方打印日志信息 常用来跟踪程序运行 查找错误原因等 可以节省大量的debug时间 muduo的日志信息有5个级别 TRACE 细粒度最高的日志信息 打印的最详细 DEBUG 细粒度级别上对调
  • 程序中的耦合与解耦学习(三)——解耦学习1

    以下内容来源于网友内容 引用网友链接 简要 一 解耦都是需要代理的 本质上并不存在没有代理就发生两个部件之间解耦的情况 二 耦合 指的是两个可以协作的部件的关系 A和B可以协作 则A和B的关系是耦合 三 如果A可以和O P Q S 简称集合
  • API接口签名验证

    系统从外部获取数据时 通常采用API接口调用的方式来实现 请求方和接口提供方之间的通信过程 有这几个问题需要考虑 1 请求参数是否被篡改 2 请求来源是否合法 3 请求是否具有唯一性 今天跟大家探讨一下主流的通信安全解决方案 参数签名方式