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

news2024/12/25 13:03:11

在这里插入图片描述

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,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开发中对签名验证有一定的了解和帮助。
在这里插入图片描述
注:在实际的项目中实现方式可能因应用场景和需求的不同而有所差异,建议根据实际情况进行相应调整。

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

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

相关文章

clickhouse断电重启故障解决方案

业务场景 公司的一个日志系统用到了clickhouse。一线运维反映说有个生产环境因为异常断电造成服务器重启。在执行日志系统的启动脚本时,一直报clickhouse启动不起来,日志系统无法使用。 问题排查 通过阅读启动脚本代码,以及启动日志系统&a…

【安全测试】Web应用安全之XSS跨站脚本攻击漏洞

目录 前言 XSS概念及分类 反射型XSS(非持久性XSS) 存储型XSS(持久型XSS) 如何测试XSS漏洞 方法一: 方法二: XSS漏洞修复 原则:不相信客户输入的数据 处理建议 资料获取方法 前言 以前都只是在各类文档中见到过XSS,也进…

接口测试前置基础学习

网址结构(面试重点) 网址就是浏览器请求的地址。 网址组成:(6个部分) 1 协议http协议,超文本传输协议,https协议,s表示ssl加密。传输更安全。 2 域名:就是ip地址。从…

巨量算数:2023中国家居行业洞察报告(附下载

关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 回首过去几年,在疫情反复、地产热度消减、人口出生率下降等各种不利因素影响下,家居行业及其上下游面临极大挑战,整体行业遇冷,市场规模的增速进一步放…

超前端相关的学习网站和一些靠谱的小工具

CSS相关 1. CSS Battle - 在线比拼 CSS https://cssbattle.dev 在线比拼 CSS ,一个挺有趣的竞争性游戏,一共有12个级别,需要你用 HTML和 CSS 100%还原它给出的页面,然后再尽量减少代码,你也可以查看全球的排行榜&am…

初级职称评审流程是什么?如何才能评初级职称呢?

职称主要代表社会地位,有高职称的人享有较高的社会经济和福利待遇,与实际技能未必有直接关联。 初级职称评审流程:初级职称评审需要以企业名义参加评审才可以,提交资料到人社局,人社局核实资料和基本情况,确…

[Qt]FrameLessWindow实现调整大小、移动弹窗并具有Aero效果

说明 我们知道QWidget等设置了this->setWindowFlags(Qt::FramelessWindowHint);后无法移动和调整大小,但实际项目中是需要窗口能够调整大小的。所以以实现FrameLess弹窗调整大小及移动弹窗需求,并且在Windows 10上有Aero效果。 先看一下效果&#xf…

光环云入选“算力服务方阵”成员单位,共筑算力新生态,赋能数字经济发展

7月26日,由中国信息通信研究院、中国通信标准化协会联合主办的“2023第十届可信云大会”在北京举办。会上,光环云正式入选国内首个算力服务研究组织——算力服务方阵,携手方阵成员共筑算力新生态,赋能数字经济发展。 算力服务方阵…

日撸java_day56-57

文章目录 day56-57kMeans 聚类代码运行截图 day56-57kMeans 聚类 1.kMeans 聚类需要中心点收敛时结束. 2.数据集为 iris, 所以最后一个属性没使用. 如果对于没有决策属性的数据集, 需要进行相应修改. 3.数据没有归一化. 4.getRandomIndices() 和 knn 的完全相同, 拷贝过来. 本…

markdown语法速记

markdown语法速记 这里只记录兼容性强的语法格式: [markdown官方文档]https://markdown.com.cn 标题 #号后跟一个空格如:“# title_level_1” 代表一级标题,两个#号代表二级标题,以此类推;最小为6级标题换行 直接…

两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 示例1: 输入:l1 [7,2,4,3], l2 [5,6,4] 输…

【ASP.NET MVC】使用动软(五)(13)

一、问题 前文完成的用户登录后的首页如下: 后续账单管理、人员管理等功能页面都有相同的头部,左边和下边,唯一不同的右边内容部分,所以要解决重复设计的问题。 二、解决方法——使用布局页 在Views上右键添加新建项&#xff…

鸿蒙4.0发布会说了啥?关注个性与效率,小艺智能程度令人惊艳

鸿蒙4.0系统的发布会已经结束,整个发布会看下来,给我最深刻的印象就是——鸿蒙4.0是一个让手机更接近个人终端的系统。但选择系统难免掺杂个人喜好和偏见,因此本文我只会从鸿蒙4.0那些让我感到惊喜的功能入手介绍,不对系统进行评价…

【深度学习Week4】MobileNet_ShuffleNet

报错:unsafe legacy renegotiation disabled 解决方案: 尝试了更换cryptography36.0.2版本,以及更换下载链接的方法,都不行,最后采用了手动下载mat文件并上传到colab的方法 高光谱图像分类数据集简介Indian Pines&…

免疫疗法勘察兵——DC细胞

DC细胞又叫树状细胞或者树突细胞,1869年由保罗兰格尔翰斯发现,一开始被误以为是神经细胞的一种,直到1973年皮肤科医师Inga Silberberg发现了他的免疫功能,同年,被拉尔夫斯坦曼和赞威尔A科恩两人正式命名为“dendritic…

《凤凰架构》第一章——演进中的部分

前言 刚开始决定弄懂文中所提到的所有东西,就像我写ByteByteGo呢几篇文章一样,把每一句话都弄懂。但是对于《凤凰架构》来说,这有点太费时间了,并且没有必要,有些东西可能永远都不会用到,但文章为了全面的…

【基础类】—CSS盒模型的全面认识

一、基本概念:标准IE模型 盒模型:margin border padding content 标准模型:将元素的宽度和高度仅计算为内容区域的尺寸(content-box,默认) 当CSS盒模型为 标准盒模型 (box-sizing: conten…

【安全测试】安全测试威胁建模设计方法STRIDE

目录 背景 TM(ThreatModeling) 实践 具体流程 资料获取方法 背景 目前安全测试一般都存在如下问题: 安全测试人员不懂业务,业务测试人员不懂安全,安全测试设计出现遗漏是无法避免的安全测试点繁多复杂,单点分析会导致风险暴…

商城-学习整理-基础-商品服务API-品牌管理(六)

目录 一、使用逆向工程生成前后端代码1、新增品牌管理菜单2、使用生成的前端代码 二、优化逆向生成的品牌管理页面1、显示状态开关优化2、品牌上传优化(使用阿里云存储)1)阿里云对象存储-普通上传方式2)阿里云对象存储-服务端签名…

paddlenlp:社交网络中多模态虚假媒体内容核查(代码篇)

初赛之baseline解读篇 一、模型框架图1、框架解读2、评价指标解读 二、代码功能1、数据集加载2、模型定义3、模型训练4、模型预测 三、写在最后 一、模型框架图 1、框架解读 第一列是输入,一部分是文本(需核查文本、文本证据材料)&#xff…