调用第三方系统的签名设计与校验实例讲解与实践

news2024/10/6 10:43:03

在现代软件开发中,调用第三方系统API已经成为常见需求。为了保证数据传输的安全性和完整性,许多API采用了签名机制。本文将详细讲解如何设计与校验调用第三方系统的签名,以确保双方通信的安全和可靠。

520e115576574b10a3db80cf3c5ed453.png

#### 一、签名机制的意义

签名机制主要有以下几个目的:

1. **身份验证**:确认请求确实来自受信任的客户端。
2. **数据完整性**:防止数据在传输过程中被篡改。
3. **防重放攻击**:防止网络上的重放攻击。5e86f36f79dd43379cc99aae0ccf4f11.png

#### 二、基本概念

在讲解具体实现之前,我们先了解几个基本概念:

- **签名(Signature)**:由请求参数通过某种算法生成的字符串,用于验证请求的合法性。
- **密钥(Secret Key)**:用于生成和校验签名的秘钥,通常只有客户端和服务端知道。
- **时间戳(Timestamp)**:用于防止重放攻击,标记请求的发送时间。80a8506562cd4846a2c2ee4403a8b9d4.png

#### 三、生成签名的流程

1. **收集请求参数**:将所有请求参数按照一定规则进行排序(通常是按字母顺序)。
2. **拼接参数字符串**:将排序后的请求参数拼接成一个字符串。
3. **附加密钥**:在参数字符串后附加上密钥。
4. **生成签名**:对拼接后的字符串进行哈希运算(如MD5、SHA256)生成签名。fdb1766c395d48ea9ea289ec2d9906ef.png

以下是一个PHP示例,演示如何生成签名:


function generateSignature($params, $secretKey) {
    // 按照键名升序排序参数
    ksort($params);
    
    // 将参数拼接成字符串
    $stringToSign = '';
    foreach ($params as $key => $value) {
        $stringToSign .= $key . '=' . $value . '&';
    }
    
    // 去掉最后一个&
    $stringToSign = rtrim($stringToSign, '&');
    
    // 在字符串后附上密钥
    $stringToSign .= $secretKey;
    
    // 生成签名
    $signature = hash('sha256', $stringToSign);
    
    return $signature;
}

// 示例调用
$params = [
    'param1' => 'value1',
    'param2' => 'value2',
    'timestamp' => time()
];

$secretKey = 'your_secret_key';
$signature = generateSignature($params, $secretKey);

echo "生成的签名: " . $signature . "\n";

#### 四、校验签名的流程

1. **接收请求**:服务端接收到客户端的请求,包括请求参数和签名。
2. **生成签名**:服务端使用相同的算法和密钥对请求参数生成签名。
3. **比较签名**:将生成的签名与请求中的签名进行比较,如果一致,则验证通过。

以下是一个PHP示例,演示如何校验签名:


function verifySignature($params, $receivedSignature, $secretKey) {
    // 从参数中移除签名
    unset($params['signature']);
    
    // 生成签名
    $generatedSignature = generateSignature($params, $secretKey);
    
    // 比较签名
    return $generatedSignature === $receivedSignature;
}

// 示例调用
$receivedSignature = $_GET['signature'];
$isValid = verifySignature($_GET, $receivedSignature, $secretKey);

if ($isValid) {
    echo "签名验证通过\n";
} else {
    echo "签名验证失败\n";
}

#### 五、防止重放攻击

为了防止重放攻击,我们通常会在请求中加入时间戳,并对其进行合理的校验。例如:

1. **检查时间戳是否在有效范围内**:如5分钟以内。
2. **记录已处理的请求**:存储近期处理过的请求ID,防止相同请求重复处理。


function isValidTimestamp($timestamp, $allowedTimeWindow = 300) {
    $currentTime = time();
    return abs($currentTime - $timestamp) <= $allowedTimeWindow;
}

// 示例调用
$timestamp = $_GET['timestamp'];
if (!isValidTimestamp($timestamp)) {
    echo "请求已过期\n";
    exit;
}

最后封装成独立请求的服务SDK

5074bff1840c42cfb48466ccee035ff5.png

业务上直接调用即可使用

b9e4d8c3838845318a204811e6ed0543.png

92c373845c284f5593c7bcb81882b780.png

#### 六、总结

签名机制在API安全性中扮演着重要角色。通过合理的签名设计与校验,可以有效地防止数据篡改和重放攻击,确保通信的安全性。在实际应用中,除了签名机制外,还应结合其他安全措施,如HTTPS、权限控制等,全面保障系统的安全。

希望本文能帮助你更好地理解和实现签名机制,如果有任何问题或建议,欢迎留言讨论。

 

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

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

相关文章

.gitignore文件忽略的内容不生效问题解决

文章目录 ①&#xff1a;现象②&#xff1a;原因③&#xff1a;解决 ①&#xff1a;现象 在已经提交过的git管理的项目中&#xff0c; 新增加一个.gitignore文件&#xff0c;文件内忽略内容不生效或者修改.gitignore文件之后&#xff0c;文件内新增的忽略内容不生效 ②&#…

Dell戴尔灵越Inspiron 16 Plus 7640/7630笔记本电脑原装Windows11下载,恢复出厂开箱状态预装OEM系统

灵越16P-7630系统包: 链接&#xff1a;https://pan.baidu.com/s/1Rve5_PF1VO8kAKnAQwP22g?pwdjyqq 提取码&#xff1a;jyqq 灵越16P-7640系统包: 链接&#xff1a;https://pan.baidu.com/s/1B8LeIEKM8IF1xbpMVjy3qg?pwdy9qj 提取码&#xff1a;y9qj 戴尔原装WIN11系…

1.华为路由器-三层交换机-二层交换机组网连接

AR1配置GE 0/0/0接口IP [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0] [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei]iP route-static 192.168.0.0 16 1.1.1.2三层交换机配置如下 创建vlan [Huawei]vlan batch 10 20配置接口ip [Huawei]int g0/0/1 [Huawei…

【数据结构】排序(下)

个人主页~ 排序&#xff08;上&#xff09; 栈和队列 排序 二、常见排序的实现8、快速排序的优化9、非递归快速排序&#xff08;1&#xff09;基本思想&#xff08;2&#xff09;代码实现&#xff08;3&#xff09;时间复杂度&#xff08;4&#xff09;空间复杂度 10、归并排序…

第二篇: 掌握Docker的艺术:深入理解镜像、容器和仓库

掌握Docker的艺术&#xff1a;深入理解镜像、容器和仓库 1. 引言 1.1 简要介绍Docker的重要性 在当今快速发展的技术世界中&#xff0c;软件开发和部署的效率和可靠性是衡量成功的关键因素。Docker&#xff0c;作为一个开源的容器化平台&#xff0c;革新了软件的打包、分发和…

016基于SSM+Jsp的医院远程诊断系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

知识普及:什么是边缘计算(Edge Computing)?

边缘计算是一种分布式计算架构&#xff0c;它将数据处理、存储和服务功能移近数据产生的边缘位置&#xff0c;即接近数据源和用户的位置&#xff0c;而不是依赖中心化的数据中心或云计算平台。边缘计算的核心思想是在靠近终端设备的位置进行数据处理&#xff0c;以降低延迟、减…

如何看懂SparkUI?

Jobs页面 Stage页面 显示额外的指标和摘要指标&#xff1a; 摘要指标&#xff08;Summary Metrics&#xff09;统计了所有完成的任务的执行行为&#xff0c;包括执行时间、GC时间、输入输出信息等&#xff0c;并提供了最小值&#xff08;Min&#xff09;、第25百分位数&#xf…

Windows环境利用 OpenCV 中 CascadeClassifier 分类器识别人脸 c++

Windows环境中配置OpenCV 关于在Windows环境中配置opencv的说明&#xff0c;具体可以参考&#xff1a;VS2022 配置OpenCV开发环境详细教程。 CascadeClassifier 分类器 CascadeClassifier 是 OpenCV 库中的一个类&#xff0c;它用于实现一种快速的物体检测算法&#xff0c;称…

Java面向对象-final关键字

Java面向对象-final关键字 一、final1、修饰变量2、修饰方法3、修饰类4、案例 一、final 可以修饰变量、方法、类 1、修饰变量 final修饰一个变量&#xff0c;变量的值不可以改变&#xff0c;这个变量就变成一个字符常量&#xff0c;约定俗称的规定&#xff1a;名字大写。 f…

基于ChatGPT的大型语言模型试用心得

近年来&#xff0c;ChatGPT这样的大型语言模型&#xff0c;它如同一颗冉冉升起的新星&#xff0c;迅速在商业、教育、娱乐等多个领域照亮了创新的天空&#xff0c;极大地革新了我们的工作与日常生活。 最近我发现一些国内用户也能自由访问的中文ChatGPT APP。这个平台不仅提供…

python-pip配置镜像源加速下载Python包安装:快速配置pip源-国内加速源

&#x1f308;所属专栏&#xff1a;【pip】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点赞…

struts2框架漏洞

title: struts2框架漏洞 categories: 漏洞复现 abbrlink: 48203 date: 2024-06-14 15:45:27 前言知识 ognl表达式注入 对象导航图语言&#xff0c;用于访问对象的字段、方法。基于简化访问java对象属性和调用方法需求&#xff0c;实现字段类型转化等功能&#xff1b;访问列表…

基于Matlab的BP神经网络的车牌识别系统(含GUI界面)【W7】

简介&#xff1a; 本系统结合了图像处理技术和机器学习方法&#xff08;BP神经网络&#xff09;&#xff0c;能够有效地实现车牌的自动识别。通过预处理、精确定位、字符分割和神经网络识别&#xff0c;系统能够准确地识别各种车牌图像&#xff0c;并在智能交通管理、安防监控等…

Java | Leetcode Java题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack new LinkedList<Integer>();minStack new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void …

java问题解决: IDEA java 警告 源发行版 17 需要目标发行版 17

效果图 问题原因 jdk和你实际安装的jdk不匹配 解决问题 1.点击File -->Project Structure–>Project 修改这两处 2. 在Project Structure–>Modules中的红框位置都要调整对应版本 3、点击File–>settings–>java compile将对应框的版本修改成对应版本即可–改…

Docker的基本操作 及 容器与外部机互相通讯(持续更新中)

Docker入门&#xff1a; Docker 入门教程 - 阮一峰的网络日志 (ruanyifeng.com)docker入门&#xff0c;这一篇就够了。-CSDN博客Docker 容器使用 | 菜鸟教程 (runoob.com)Docker自定义网络和运行时指定IP_docker run ip-CSDN博客 基本命令 链接&#xff1a;docker入门&#…

MVC 框架安全

在现代 Web 开发中&#xff0c;使用 MVC 架构是一种流行的做法。MVC 是 Model-View-Controller 的缩写&#xff0c;它将 Web 应用分为三层&#xff0c;View 层负责用户视图、页面展示等工作&#xff1b;Controller 负责应 用的逻辑实现&#xff0c;接收 View 层传入的用户请求&…

Luma AI如何注册:文生视频领域的新星

文章目录 Luma AI如何注册&#xff1a;文生视频领域的新星一、Luma 注册方式二、Luma 的效果三、Luma 的优势四、Luma 的功能总结 Luma AI如何注册&#xff1a;文生视频领域的新星 近年来&#xff0c;Luma AI 凭借其在文生视频领域的创新技术&#xff0c;逐渐成为行业的新星。…

【如何保持专注】

今日&#x1f4d2;&#xff0c;看博主分享下保持专注的新方法&#xff0c;有点意思 &#xff0c; 怎么保持专注&#xff0c;给大家分享两个极客的方法啊。 第一个呢是来自于一个非常著名的程序员啊&#xff0c;叫做这个尼克温特&#xff0c;大家有兴趣可以查一下&#xff0c;就…