php生成签名及验证签名
封面图
•
2025-10-02
•
PHP
260
0
0
0
在 PHP 中生成和验证签名(Signature)是确保数据完整性、防止篡改的重要手段。常见的做法是使用 HMAC-SHA256 算法,结合密钥对数据进行加密处理。 --- ## ✅ 一、生成签名(Sign) ### 示例:根据参数生成签名 ```php <?php // 假设这是你的密钥 $secretKey = 'your_secret_key'; // 要签名的数据(通常为排序后的参数字符串) $data = [ 'timestamp' => time(), 'action' => 'create_order', 'user_id' => 12345 ]; // 按照 key 排序后拼接成字符串 ksort($data); $paramString = http_build_query($data); // 使用 HMAC-SHA256 生成签名 $signature = hash_hmac('sha256', $paramString, $secretKey); // 输出签名 echo "Signature: " . $signature; ``` > ⚠️ 注意: > - 参数要按照 key 的字典顺序排序(`ksort()`)。 > - `http_build_query()` 会将数组转换为 `key1=value1&key2=value2` 格式。 > - 签名应作为请求的一部分发送给服务端。 --- ## ✅ 二、验证签名(Verify) ### 示例:接收参数并验证签名 ```php <?php // 接收的参数(模拟从请求中获取) $inputData = [ 'timestamp' => time(), 'action' => 'create_order', 'user_id' => 12345, 'signature' => 'generated_signature_here' ]; // 密钥 $secretKey = 'your_secret_key'; // 移除 signature 字段 unset($inputData['signature']); // 按 key 排序并拼接参数 ksort($inputData); $paramString = http_build_query($inputData); // 重新生成签名 $expectedSignature = hash_hmac('sha256', $paramString, $secretKey); // 验证签名是否匹配 if ($expectedSignature === $inputData['signature']) { echo "签名验证通过!"; } else { echo "签名验证失败!"; } ``` --- ## ✅ 三、注意事项 | 项目 | 说明 | |------|------| | **签名算法** | 推荐使用 `HMAC-SHA256`,安全性高 | | **参数排序** | 必须按 key 排序,否则签名不一致 | | **密钥安全** | 不能暴露在客户端,应保存在服务器端 | | **时间戳校验** | 可以加入时间戳限制(如 5 分钟内有效) | | **防重放攻击** | 可以引入 nonce 或 token 来防止重复请求 | --- ## ✅ 四、扩展:带时间戳的签名验证 ```php <?php // 时间戳允许范围(单位:秒) $timeWindow = 5; // 获取当前时间 $now = time(); // 获取用户传来的 timestamp $userTimestamp = $inputData['timestamp']; // 判断时间是否在允许范围内 if (abs($now - $userTimestamp) > $timeWindow) { die("时间戳无效!"); } // 继续验证签名... ``` --- ## ✅ 五、完整示例(生成 + 验证) ```php <?php function generateSignature(array $data, string $secretKey): string { ksort($data); $paramString = http_build_query($data); return hash_hmac('sha256', $paramString, $secretKey); } function verifySignature(array $data, string $secretKey): bool { if (!isset($data['signature'])) { return false; } $signature = $data['signature']; unset($data['signature']); ksort($data); $paramString = http_build_query($data); $expected = hash_hmac('sha256', $paramString, $secretKey); return $expected === $signature; } // 示例用法 $secretKey = 'your_secret_key'; $data = [ 'timestamp' => time(), 'action' => 'create_order', 'user_id' => 12345 ]; $signature = generateSignature($data, $secretKey); $data['signature'] = $signature; // 验证 if (verifySignature($data, $secretKey)) { echo "签名验证成功!"; } else { echo "签名验证失败!"; } ``` --- 如果你有具体的业务场景(比如 API 请求、Webhook 签名等),我可以帮你定制更详细的实现方案。需要的话请告诉我!
上一篇:
常见 MIME 类型列表
下一篇:
PHP 输出本月,本季度,本年,上月,上季度,上一年的开始和结束日期
标题录入,一次不能超过6条
返回顶部
留言
留言
评论