PHP 基础的SIGN算法

128次阅读
没有评论

共计 272 个字符,预计需要花费 1 分钟才能阅读完成。

算法思路

  1. 数据预处理:对传入的数据进行清理,去除空值和不必要的字段,同时对数据进行编码处理。
  2. 数据排序:按照键名的字典序对数据进行排序。
  3. 拼接数据:将排序好的数据键值对用特定的连接符拼接成一个字符串。
  4. 添加时间戳和随机数:在拼接好的字符串中加入当前时间戳和随机数,增加签名的唯一性和时效性。
  5. 使用 HMAC – SHA256:使用 HMAC – SHA256 算法对拼接后的字符串进行哈希计算,使用密钥作为 HMAC 的密钥。
  6. Base64 编码:对 HMAC – SHA256 的结果进行 Base64 编码,方便传输和存储。

    代码示例

      
    <?php
    /**
     * 生成签名
     *
     * @param array $data 待签名的数据
     * @param string $secretKey 密钥
     * @return string 签名结果
     */
    function generateSign(array $data, string $secretKey): string
    {
        // 移除可能存在的 sign 字段
        if (isset($data['sign'])) {unset($data['sign']);
        }
        // 数据预处理:去除空值和对值进行 URL 编码
        $cleanedData = [];
        foreach ($data as $key => $value) {if ($value!== null && $value!== '') {$cleanedData[$key] = urlencode($value);
            }
        }
        // 按照键名进行字典序排序
        ksort($cleanedData);
        // 拼接数据
        $signStr = '';
        foreach ($cleanedData as $key => $value) {$signStr.= $key. '='. $value. '&';}
        // 去掉最后一个多余的 & 符号
        $signStr = rtrim($signStr, '&');
        // 添加时间戳和随机数
        $timestamp = time();
        $nonce = bin2hex(random_bytes(16));
        $signStr.= '&timestamp='. $timestamp. '&nonce='. $nonce;
        // 使用 HMAC - SHA256 进行哈希计算
        $hmac = hash_hmac('sha256', $signStr, $secretKey, true);
        // 对 HMAC 结果进行 Base64 编码
        return base64_encode($hmac);
    }
    // 示例数据
    $data = [
        'param1' => 'value1',
        'param2' => 'value2',
        'param3' => 'value3'
    ];
    // 密钥,可根据实际情况修改
    $secretKey = 'your_secret_key';
    // 生成签名
    $sign = generateSign($data, $secretKey);
    echo " 签名结果: ". $sign;
     
     
     
     

    代码解释

  7. 数据预处理:遍历数据数组,去除空值和 sign 字段,并对值进行 URL 编码,确保数据的一致性和安全性。
  8. 数据排序:使用 ksort 函数对清理后的数据数组按照键名进行字典序排序。
  9. 拼接数据:将排序好的数据键值对用 & 符号拼接成一个字符串。
  10. 添加时间戳和随机数:使用 time() 函数获取当前时间戳,使用 random_bytes() 函数生成一个 16 字节的随机数,并将它们添加到拼接好的字符串中。
  11. HMAC – SHA256 计算:使用 hash_hmac 函数对拼接后的字符串进行 HMAC – SHA256 哈希计算,使用密钥作为 HMAC 的密钥。
  12. Base64 编码:使用 base64_encode 函数对 HMAC – SHA256 的结果进行 Base64 编码,方便传输和存储。

    安全性和适配性说明

  • 安全性:该算法结合了数据清理、时间戳、随机数和 HMAC – SHA256 哈希算法,增加了签名的唯一性、时效性和安全性。
  • 适配性:可以处理各种类型的数据数组,并且可以根据实际需求调整时间戳的有效期和随机数的长度。同时,Base64 编码的结果可以方便地在不同系统之间传输。

正文完
 1
oiapi
版权声明:本站原创文章,由 oiapi 于2025-05-29发表,共计272字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码