PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > 工作总结

php 生成签名及验证签名详解

管理员 2025-02-21
工作总结
41

在 PHP 中,生成签名和验证签名是确保数据完整性和安全性的重要手段。签名通常用于 API 请求、数据传输等场景,以防止数据被篡改。以下是生成签名和验证签名的详细实现方法及示例代码。


1. 生成签名

生成签名的基本步骤如下:

  1. 将需要签名的数据按一定规则排序(如按参数名升序)。

  2. 将排序后的数据拼接成字符串。

  3. 使用密钥对拼接后的字符串进行加密(如 HMAC-SHA256)。

  4. 将加密结果转换为签名。

示例代码

php
复制
<?phpfunction generateSignature($data, $secretKey) {
    // 1. 按参数名升序排序
    ksort($data);

    // 2. 拼接字符串
    $stringToSign = '';
    foreach ($data as $key => $value) {
        $stringToSign .= $key . '=' . $value . '&';
    }
    $stringToSign = rtrim($stringToSign, '&');

    // 3. 使用 HMAC-SHA256 加密
    $signature = hash_hmac('sha256', $stringToSign, $secretKey);

    return $signature;}// 示例数据$data = [
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'timestamp' => time(),];$secretKey = 'your_secret_key';// 生成签名$signature = generateSignature($data, $secretKey);echo "生成的签名: $signature\n";?>

2. 验证签名

验证签名的基本步骤如下:

  1. 从请求中获取签名和数据。

  2. 按照生成签名的规则重新生成签名。

  3. 比较生成的签名与请求中的签名是否一致。

示例代码

php
复制
<?phpfunction verifySignature($data, $secretKey, $receivedSignature) {
    // 1. 按参数名升序排序
    ksort($data);

    // 2. 拼接字符串
    $stringToSign = '';
    foreach ($data as $key => $value) {
        $stringToSign .= $key . '=' . $value . '&';
    }
    $stringToSign = rtrim($stringToSign, '&');

    // 3. 使用 HMAC-SHA256 加密
    $generatedSignature = hash_hmac('sha256', $stringToSign, $secretKey);

    // 4. 比较签名
    return hash_equals($generatedSignature, $receivedSignature);}// 示例数据$data = [
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'timestamp' => time(),];$secretKey = 'your_secret_key';$receivedSignature = '生成的签名'; // 替换为实际接收到的签名// 验证签名if (verifySignature($data, $secretKey, $receivedSignature)) {
    echo "签名验证成功!";} else {
    echo "签名验证失败!";}?>

3. 注意事项

  1. 密钥管理

    • 密钥($secretKey)必须保密,不能泄露。

    • 建议将密钥存储在环境变量或配置文件中。

  2. 数据排序

    • 生成签名时,必须按照相同的规则排序数据,否则签名验证会失败。

  3. 时间戳

    • 在数据中加入时间戳(如 timestamp),可以防止重放攻击。

    • 验证签名时,检查时间戳是否在有效范围内。

  4. 哈希算法

    • 推荐使用 HMAC-SHA256,安全性较高。

    • 避免使用 MD5 或 SHA1 等不安全的哈希算法。

  5. 签名比较

    • 使用 hash_equals() 比较签名,避免时序攻击。


4. 完整示例

以下是一个完整的示例,包括生成签名、发送请求、接收请求并验证签名。

客户端代码(生成签名并发送请求)

php
复制
<?phpfunction generateSignature($data, $secretKey) {
    ksort($data);
    $stringToSign = '';
    foreach ($data as $key => $value) {
        $stringToSign .= $key . '=' . $value . '&';
    }
    $stringToSign = rtrim($stringToSign, '&');
    return hash_hmac('sha256', $stringToSign, $secretKey);}$data = [
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'timestamp' => time(),];$secretKey = 'your_secret_key';$signature = generateSignature($data, $secretKey);// 将签名添加到数据中$data['signature'] = $signature;// 发送请求$url = 'https://example.com/api';$ch = curl_init($url);curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$response = curl_exec($ch);curl_close($ch);echo "服务器响应: $response\n";?>

服务器端代码(验证签名)

php
复制
<?phpfunction verifySignature($data, $secretKey, $receivedSignature) {
    ksort($data);
    $stringToSign = '';
    foreach ($data as $key => $value) {
        if ($key !== 'signature') { // 排除签名字段
            $stringToSign .= $key . '=' . $value . '&';
        }
    }
    $stringToSign = rtrim($stringToSign, '&');
    $generatedSignature = hash_hmac('sha256', $stringToSign, $secretKey);
    return hash_equals($generatedSignature, $receivedSignature);}// 获取 POST 数据$data = $_POST;$receivedSignature = $data['signature'];$secretKey = 'your_secret_key';// 验证签名if (verifySignature($data, $secretKey, $receivedSignature)) {
    echo "签名验证成功!";} else {
    echo "签名验证失败!";}?>

5. 总结

步骤说明
生成签名按规则排序数据,拼接字符串,使用 HMAC 加密
验证签名重新生成签名并与接收到的签名比较
密钥管理确保密钥保密
时间戳防止重放攻击
哈希算法推荐使用 HMAC-SHA256
签名比较使用 hash_equals() 避免时序攻击

通过以上方法,可以确保数据在传输过程中的完整性和安全性。



本文关键词: 签名 php 生成 验证 详解

希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部

网站数据概况 - 最近活跃访客0今日访问人数4今日访问量11昨日访问人数11昨日访问量32本月访问量97总访问量5,631