PHP实践:用openssl打造安全可靠的API签名验证系统

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。
🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。
🏆本文已收录于专栏:100个JavaScript的小应用。
🎉欢迎 👍点赞✍评论⭐收藏
文章目录
- 🚀一、引言
- 🚀二、验证过程概述
- 🚀三、设计步骤
- 🔎3.1 生成密钥对
- 🔎3.2 签名生成和验证函数的实现
- 🍁3.2.1 准备工作
- 🍁3.2.2 生成签名
- 🍁3.2.3 验证签名
- 🔎3.3 使用SDK调用API
- 🚀四、总结
🚀一、引言
在Web开发中,API(Application Programming
Interface)是不可或缺的一部分。为了确保API请求的安全性,常常需要对API请求进行签名验证。本文将介绍如何使用PHP设计一套API签名验证的程序,并提供具体的设计步骤和代码。

🚀二、验证过程概述
本篇文章主要通过openssl来实现安全的加密解密,API签名验证的过程通常包括以下几个步骤,:
- 客户端使用私钥对请求数据进行加密,并将加密结果作为签名参数(例如传递给API的
signature参数)。 - 服务端接收到API请求后,根据相应规则从请求参数中提取出签名参数。
- 服务端使用相同的私钥和加密算法对请求数据进行加密,并得到一个临时的签名。
- 服务端将临时的签名与客户端传递的签名进行比较,如果两者一致,则API请求通过验证,否则验证失败。

🚀三、设计步骤
下面是一套设计API签名验证程序的具体步骤:
🔎3.1 生成密钥对
首先,我们需要生成一对公钥和私钥,用于加密和解密。可以使用openssl扩展来生成密钥对,具体代码如下:
$config = array("private_key_bits" => 1024,"private_key_type" => OPENSSL_KEYTYPE_RSA,
);// 生成私钥和公钥
$res = openssl_pkey_new($config);// 提取私钥
openssl_pkey_export($res, $private_key);// 提取公钥
$public_key = openssl_pkey_get_details($res);
$public_key = $public_key["key"];// 保存私钥和公钥到文件
file_put_contents('private.key', $private_key);
file_put_contents('public.key', $public_key);
上述代码将生成私钥保存到private.key文件中,公钥保存到public.key文件中。
🔎3.2 签名生成和验证函数的实现
🍁3.2.1 准备工作
在签名生成和验证之前,我们需要加载私钥和公钥。可以创建一个Signature类,并在构造函数中加载私钥和公钥,如下所示:
class Signature {private $private_key;private $public_key;public function __construct() {$this->private_key = openssl_pkey_get_private(file_get_contents('private.key'));$this->public_key = openssl_pkey_get_public(file_get_contents('public.key'));}// 其他方法和代码将在后面介绍
}
🍁3.2.2 生成签名
为了生成签名,我们需要定义一个方法,该方法接收请求参数数组并返回签名结果。可以使用openssl扩展中的openssl_sign函数生成签名,代码如下:
class Signature {// 省略部分代码public function generateSignature($params) {// 将请求参数数组转换为字符串$data = http_build_query($params);// 使用私钥进行签名openssl_sign($data, $signature, $this->private_key);// 将签名结果进行Base64编码$signature = base64_encode($signature);return $signature;}
}
🍁3.2.3 验证签名
为了验证签名,我们需要定义一个方法,该方法接收请求参数数组和客户端传递的签名,并返回验证结果。可以使用openssl扩展中的openssl_verify函数验证签名,代码如下:
class Signature {// 省略部分代码public function verifySignature($params, $clientSignature) {// 将请求参数数组转换为字符串$data = http_build_query($params);// 对客户端传递的签名进行Base64解码$clientSignature = base64_decode($clientSignature);// 使用公钥进行签名验证$result = openssl_verify($data, $clientSignature, $this->public_key);return $result === 1;}
}
🔎3.3 使用SDK调用API
为了方便客户端调用API并进行签名验证,我们可以创建一个简单的SDK。SDK将提供一些封装好的方法,让开发者能够轻松地调用API并进行签名验证。
以下是一个示例SDK的代码:
class APIClient {private $apiURL;private $signature;public function __construct($apiURL, $privateKeyPath, $publicKeyPath) {$this->apiURL = $apiURL;// 初始化签名验证类$this->signature = new Signature($privateKeyPath, $publicKeyPath);}public function callAPI($params) {// 生成签名$signature = $this->signature->generateSignature($params);// 将签名添加到请求参数中$params['signature'] = $signature;// 发送API请求$response = $this->sendRequest($params);// 验证签名$isValid = $this->signature->verifySignature($params, $response['signature']);// 如果验证通过,则返回API响应数据if ($isValid) {return $response['data'];} else {throw new Exception("Invalid signature");}}private function sendRequest($params) {// 使用cURL库发送HTTP请求$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $this->apiURL);curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$response = curl_exec($ch);curl_close($ch);// 解析API响应数据return json_decode($response, true);}
}
SDK的使用示例:
$apiURL = 'http://ssss.com/api.php';
$privateKeyPath = '/path/to/private.key';
$publicKeyPath = '/path/to/public.key';// 创建APIClient实例
$client = new APIClient($apiURL, $privateKeyPath, $publicKeyPath);// 准备API请求参数
$params = array('param1' => 'value1','param2' => 'value2',
);try {// 调用API,并获取响应结果$result = $client->callAPI($params);// 处理API响应数据// ...
} catch (Exception $e) {// 处理异常情况// ...
}
🚀四、总结
本文介绍了如何使用PHP设计一套API签名验证的程序。通过生成密钥对、实现签名生成和验证函数以及使用SDK调用API,我们可以提高API请求的安全性,并确保请求以及响应数据的完整性。希望本文能对大家在API开发中对签名验证有一定的了解和帮助。

注:在实际的项目中实现方式可能因应用场景和需求的不同而有所差异,建议根据实际情况进行相应调整。
相关文章:
PHP实践:用openssl打造安全可靠的API签名验证系统
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已…...
每天一道leetcode:剑指 Offer 50. 第一个只出现一次的字符(适合初学者)
今日份题目: 在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。 示例1 输入:s "abaccdeff" 输出:b 示例2 输入:s "" 输出: 提示 0 …...
【第五章 flutter学习之flutter进阶组件-下篇】
文章目录 一、Scaffold属性二、TabBar三、路由四、AlertDialog、SimpleDialog、showM...五、PageView六、Key七、AnimatedList八、动画 一、Scaffold属性 Flutter Scaffold 是一个用于构建基本用户界面的布局组件。它提供了许多属性,使得开发者能够轻松地创建一个完…...
单元测试和集成测试有什么区别
单元测试和集成测试有什么区别 单元测试和集成测试是软件开发中的两个重要测试阶段,它们的主要区别如下: 目的: 单元测试:主要针对代码的最小可测试单元,通常是一个函数或方法,确保它按照预期工作。集成…...
如何实现基于场景的接口自动化测试用例?
自动化本身是为了提高工作效率,不论选择何种框架,何种开发语言,我们最终想实现的效果,就是让大家用最少的代码,最小的投入,完成自动化测试的工作。 基于这个想法,我们的接口自动化测试思路如下…...
SAP 开发编辑界面-关闭助手
打开关闭助手时的开发界面如下: 关闭关闭助手后的界面如下: 菜单栏: 编辑--》修改操作--》关闭助手...
【el-image图片查看时 样式穿透表格问题】
element-ui el-image图片查看 样式混乱 解决方式 ::v-deep(.el-table__cell) {position: static !important; // 解决el-image 和 el-table冲突层级冲突问题 }加个样式即可...
GPT带我学-设计模式-模板模式
1 请你给我介绍一下设计模式中的模板模式 模板模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。模板模式允许子类重新定义算法的某些特定步骤,而不需要改变算法的结构。 模板模式由以下几个角色组成&…...
Windows下调试UEFI程序:Visual Studio调试
以edk2\MdeModulePkg\Application\HelloWorld这个项目作为调试目标。 1. 使用VS2017建立Makefile工程 VS2017, 新建 project,取名X64dbg_vs。 Visual C > Other > Makefile Project, 注意项目路径为HelloWord程序路径。 随便填写config中的字符串ÿ…...
Vue中监听路由参数变化的几种方式
目录 一. 路由监听方式: 通过 watch 进行监听 1. 监听路由从哪儿来到哪儿去 2. 监听路由变化获取新老路由信息 3. 监听路由变化触发方法 4. 监听路由的 path 变化 5. 监听路由的 path 变化, 使用handler函数 6. 监听路由的 path 变化,触发method…...
angular——子组件如何接收父组件的动态传值
开发过程中,父组件给子组件传值的情况很常见,今天我们就来聊聊父组件给子组件传值可能会发生哪些意外,什么情况下子组件无法接收到父组件最新的传值; 传值情况: 基本数据类型:父组件给子组件传递 基本数据…...
php 桥接模式
一,桥接模式,是结构设计模式的一种,其将抽象部分和实现部分分离开来,使两部分可以独立的进行修改,提高系统的灵活性。在桥接模式中,需要定义一个抽象类和一个实现类,通过将实现类注入到抽象类中…...
Android 13 Hotseat定制化修改——004 hotseat布局位置
目录 一.背景 二.原生hotseat布局位置 三.修改Hotseat布局位置 一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat…...
海外版金融理财系统源码 国际投资理财系统源码 项目投资理财源码
海外版金融理财系统源码 国际投资理财系统源码 项目投资理财源码...
洛谷P1162 - 填涂颜色
题目描述 由数字 0 0 0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 1 1 构成,围圈时只走上下左右 4 4 4 个方向。现要求把闭合圈内的所有空间都填写成 2 2 2。例如: 6 6 6\times 6 66 的方阵( n 6 n6 n6&…...
设计模式十一:外观模式(Facade Pattern)
外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。外观模式通过将复杂子系统的接口封装在一个高层接口中,简化了客户端与子系统之间的交互,使得客户…...
GIS和倾斜摄影的关系?
GIS(地理信息系统)和倾斜摄影是两种在地理空间数据处理和分析中扮演重要角色的技术。但是我们总是会分不清二者,本文就带大家从不同角度了解二者之间的关系。 概念 GIS是一种用来捕获、存储、分析和展示地理空间数据的技术,它可以…...
【CI/CD】图解六种分支管理模型
图解六种分支管理模型 任何一家公司乃至于一个小组织,只要有写代码的地方,就有代码版本管理的主场,初入职场,总会遇到第一个拦路虎 git 管理流程,但是每一个企业似乎都有自己的 git 管理流程,倘若我们能掌握…...
LeetCode105. 从前序与中序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树 文章目录 [105. 从前序与中序遍历序列构造二叉树](https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)一、题目二、题解 一、题目 给定两个整数数组 preorder 和 inorder ,其中 preo…...
编码技巧——Sentinel的blockHandler与fallback
本文介绍Sentinel的blockHandler与fallback的区别,背景是:发生限流时,配置的sentinel的blockhandler没有生效而fallback生效了;排查原因,从而给出Sentinel配置异常降级和限流降级的代码写法; 在查看源码前…...
如何高效处理大规模地图数据:Google Maps Services Python 并发处理终极指南
如何高效处理大规模地图数据:Google Maps Services Python 并发处理终极指南 【免费下载链接】google-maps-services-python Python client library for Google Maps API Web Services 项目地址: https://gitcode.com/gh_mirrors/go/google-maps-services-python …...
springboot+vue基于web的校园失物招领系统的设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块分析交互与流程设计技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块分析 用户模块 注册与登录&…...
Leaflet图层顺序实战:如何用setZIndex和bringToFront让你的地图层级不再混乱
Leaflet图层顺序实战:如何用setZIndex和bringToFront让你的地图层级不再混乱 当地图上同时存在多个图层时,你是否遇到过标注被底图遮盖、动态添加的标记消失在多边形下方,或是图层叠加顺序完全失控的情况?这些看似简单的层级问题&…...
从v4l2-ctl命令到media拓扑:手把手教你调试RK3568上的OV8858摄像头图像
RK3568平台OV8858摄像头深度调试实战:从硬件链路到图像优化的全流程解析 当你在RK3568平台上调试OV8858摄像头时,是否遇到过这样的场景:设备树配置看似正确,但摄像头输出的图像却出现花屏、颜色异常或干脆没有信号?作为…...
Ubuntu 18.04 + CUDA 11.3 下,手把手教你搞定 MinkowskiEngine 的编译安装(附避坑指南)
Ubuntu 18.04 CUDA 11.3 环境下的 MinkowskiEngine 编译实战指南 在3D点云处理和稀疏卷积领域,MinkowskiEngine 凭借其高效的稀疏张量计算能力已成为研究者的重要工具。然而,其复杂的依赖关系和编译过程常常让开发者望而却步。本文将基于 Ubuntu 18.04…...
从原理到实战:位运算巧解最小码距(附完整代码)
1. 什么是码距?从生活场景理解概念 第一次听到"码距"这个词时,我脑海里浮现的是超市货架上相似商品间的距离。后来才发现,在计算机世界里,它描述的是两个编码之间的差异程度。举个生活中的例子:假设我们用5…...
从代码到部署:手把手复现CenterPoint(PyTorch版)在KITTI数据集上的完整流程
从零实现CenterPoint:KITTI数据集3D目标检测全流程实战指南 为什么选择CenterPoint进行3D目标检测? 在自动驾驶和机器人感知领域,3D目标检测一直是核心技术难题。传统基于锚框(Anchor-based)的方法在处理旋转物体时表现…...
OpenClaw 的模型训练中,是否使用了半监督学习?伪标签策略?
关于OpenClaw在语音对话中是否支持多通道音频处理,其实可以从一个更贴近实际工程的角度来看。多通道音频处理在语音识别领域并不是一个简单的“支持”或“不支持”就能概括的问题,它背后涉及的是整个音频处理管道的设计思路和实际应用场景的匹配程度。 从…...
THE LEATHER ARCHIVE快速体验:一键生成杂志级AI皮衣大片,小白也能当设计师
THE LEATHER ARCHIVE快速体验:一键生成杂志级AI皮衣大片,小白也能当设计师 1. 项目介绍与核心价值 想象一下,你不需要专业的设计技能,就能创造出媲美时尚杂志封面的皮衣设计作品。THE LEATHER ARCHIVE正是这样一个让创意触手可及…...
SDMatte效果对比评测:与传统抠图工具及在线API的全面比拼
SDMatte效果对比评测:与传统抠图工具及在线API的全面比拼 1. 开篇:为什么需要新的抠图方案 在数字内容创作领域,抠图一直是个让人又爱又恨的技术活。记得去年帮朋友做电商产品图,光是给20个商品抠图就花了我整整一个周末。传统工…...
