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


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

    520e115576574b10a3db80cf3c5ed453.png

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

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

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

    #### 二、基本概念

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

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

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

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

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

    1. function generateSignature($params, $secretKey) {
    2.     // 按照键名升序排序参数
    3.     ksort($params);
    4.     
    5.     // 将参数拼接成字符串
    6.     $stringToSign = '';
    7.     foreach ($params as $key => $value) {
    8.         $stringToSign .= $key . '=' . $value . '&';
    9.     }
    10.     
    11.     // 去掉最后一个&
    12.     $stringToSign = rtrim($stringToSign, '&');
    13.     
    14.     // 在字符串后附上密钥
    15.     $stringToSign .= $secretKey;
    16.     
    17.     // 生成签名
    18.     $signature = hash('sha256', $stringToSign);
    19.     
    20.     return $signature;
    21. }
    22. // 示例调用
    23. $params = [
    24.     'param1' => 'value1',
    25.     'param2' => 'value2',
    26.     'timestamp' => time()
    27. ];
    28. $secretKey = 'your_secret_key';
    29. $signature = generateSignature($params, $secretKey);
    30. echo "生成的签名: " . $signature . "\n";

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

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

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

    1. function verifySignature($params, $receivedSignature, $secretKey) {
    2.     // 从参数中移除签名
    3.     unset($params['signature']);
    4.     
    5.     // 生成签名
    6.     $generatedSignature = generateSignature($params, $secretKey);
    7.     
    8.     // 比较签名
    9.     return $generatedSignature === $receivedSignature;
    10. }
    11. // 示例调用
    12. $receivedSignature = $_GET['signature'];
    13. $isValid = verifySignature($_GET, $receivedSignature, $secretKey);
    14. if ($isValid) {
    15.     echo "签名验证通过\n";
    16. } else {
    17.     echo "签名验证失败\n";
    18. }

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

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

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

    1. function isValidTimestamp($timestamp, $allowedTimeWindow = 300) {
    2.     $currentTime = time();
    3.     return abs($currentTime - $timestamp) <= $allowedTimeWindow;
    4. }
    5. // 示例调用
    6. $timestamp = $_GET['timestamp'];
    7. if (!isValidTimestamp($timestamp)) {
    8.     echo "请求已过期\n";
    9.     exit;
    10. }

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

    5074bff1840c42cfb48466ccee035ff5.png

    业务上直接调用即可使用

    b9e4d8c3838845318a204811e6ed0543.png

    92c373845c284f5593c7bcb81882b780.png

    #### 六、总结

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

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

     

  • 相关阅读:
    C# 正则表达式判断是否是有效的文件、文件夹路径
    [附源码]计算机毕业设计JAVA人力资源管理系统论文2022
    AI实践与学习1_Milvus向量数据库实践与原理分析
    ViTPose+:迈向通用身体姿态估计的视觉Transformer基础模型
    字符串的模式匹配
    AI绘画软件汇总
    基于C语言实现的Linux系统中的EXT2文件系统
    Spring Cloud Kubernetes:在Kubernetes中部署和管理微服务
    idea部署Tomcat web项目报错
    GBase 8c V3.0.0数据类型——TIMESTAMPDIFF
  • 原文地址:https://blog.csdn.net/qq_33665793/article/details/139704238