php API 请求签名
封面图
•
2026-04-09
•
PHP
25
0
0
0
在 PHP 中实现 API 请求签名(Signature)是一种常见的安全机制,用于验证请求的合法性,防止请求被篡改或伪造。通常,签名是通过将请求参数、密钥等信息进行加密生成的,服务器端再根据相同的规则验证签名是否正确。 --- ## 一、常见签名流程 1. **客户端**: - 收集所有请求参数(包括 `GET` 和 `POST` 参数)。 - 按照一定规则排序(如按字段名字母顺序)。 - 将参数拼接成字符串(如:`key1=value1&key2=value2`)。 - 使用密钥(Secret Key)对拼接后的字符串进行加密(如:MD5、SHA1、HMAC-SHA256 等)。 - 将生成的签名作为参数发送到服务端。 2. **服务端**: - 接收请求参数和签名。 - 按相同规则拼接参数。 - 使用相同的密钥重新计算签名。 - 对比客户端传来的签名与服务端生成的签名是否一致。 --- ## 二、PHP 实现示例(HMAC-SHA256) ### 客户端代码(生成签名): ```php <?php $secretKey = 'your-secret-key'; $params = [ 'param1' => 'value1', 'param2' => 'value2', ]; // 按字段名排序 ksort($params); // 拼接参数 $paramString = http_build_query($params); // 生成签名 $signature = hash_hmac('sha256', $paramString, $secretKey); // 发送请求时带上 signature 参数 $params['signature'] = $signature; // 可以使用 curl 发送 POST 请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/endpoint'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); echo $response; ``` --- ### 服务端代码(验证签名): ```php <?php $secretKey = 'your-secret-key'; // 获取所有请求参数 $params = $_POST; // 或 $_GET,视情况而定 // 移除 signature 参数 $signature = $params['signature']; unset($params['signature']); // 按字段名排序 ksort($params); // 拼接参数 $paramString = http_build_query($params); // 重新生成签名 $expectedSignature = hash_hmac('sha256', $paramString, $secretKey); // 验证签名 if ($signature === $expectedSignature) { echo "签名验证通过"; } else { echo "签名验证失败"; } ``` --- ## 三、注意事项 - **参数排序**:必须按照相同的规则排序(通常是按 key 的字母顺序)。 - **参数编码**:建议使用 `http_build_query()` 处理参数,确保编码一致。 - **密钥保密**:不要将密钥暴露在客户端或日志中。 - **时间戳**:可以加上时间戳并限制有效期(如 5 分钟内有效),防止重放攻击。 - **签名字段命名**:推荐使用 `sign` 或 `signature` 等统一字段名。 --- ## 四、扩展:带时间戳的签名 ```php // 客户端添加时间戳 $params['timestamp'] = time(); // 服务端验证时间戳 if (abs(time() - $params['timestamp']) > 300) { die("请求过期"); } ``` --- 如果你有具体的 API 接口文档或需要支持其他算法(如 MD5、SHA1),也可以告诉我,我可以帮你定制更详细的实现。
上一篇:
php 经典设计模式
下一篇:
PHPUnit 测试与调试
标题录入,一次不能超过6条
留言
评论