当前位置: 首页 > news >正文

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签名验证的过程通常包括以下几个步骤,:

  1. 客户端使用私钥对请求数据进行加密,并将加密结果作为签名参数(例如传递给API的signature参数)。
  2. 服务端接收到API请求后,根据相应规则从请求参数中提取出签名参数。
  3. 服务端使用相同的私钥和加密算法对请求数据进行加密,并得到一个临时的签名。
  4. 服务端将临时的签名与客户端传递的签名进行比较,如果两者一致,则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中的字符串&#xff…...

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配置异常降级和限流降级的代码写法; 在查看源码前…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

如何在网页里填写 PDF 表格?

有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据&#xff…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...