appSecret = $appSecret;
}
/**
* 生成签名(调用方使用)
* @param array $params 请求参数(不含sign)
* @return array 带签名的完整参数
*/
public function generateSign(array $params): array
{
// 1. 过滤空值、sign参数
$filterParams = array_filter($params, function ($value) {
return $value !== '' && $value !== null;
});
unset($filterParams['sign']);
// 2. 参数按字典序排序
ksort($filterParams);
// 3. 拼接成key1=value1&key2=value2...格式
$stringToBeSigned = http_build_query($filterParams, '', '&', PHP_QUERY_RFC3986);
// 4. 拼接密钥,生成HMAC-SHA256签名
$sign = hash_hmac('sha256', $stringToBeSigned, $this->appSecret);
$filterParams['sign'] = $sign;
$filterParams['timestamp'] = time();
$filterParams['nonce'] = bin2hex(random_bytes(8)); // 随机串防重放
return $filterParams;
}
/**
* 校验签名(接收方使用)
* @param array $params 请求参数(含sign)
* @return bool 校验是否通过
*/
public function verifySign(array $params): bool
{
// 1. 校验时间戳是否过期
if (isset($params['timestamp']) && (time() - $params['timestamp']) > $this->timestampExpire) {
return false;
}
// 2. 校验nonce是否重复(需配合Redis存储已使用的nonce,此处省略Redis逻辑)
// if ($this->isNonceUsed($params['nonce'])) { return false; }
// 3. 提取sign,过滤后生成待校验签名
$sign = $params['sign'] ?? '';
unset($params['sign'], $params['timestamp'], $params['nonce']);
$filterParams = array_filter($params, function ($value) {
return $value !== '' && $value !== null;
});
ksort($filterParams);
$stringToBeSigned = http_build_query($filterParams, '', '&', PHP_QUERY_RFC3986);
$verifySign = hash_hmac('sha256', $stringToBeSigned, $this->appSecret);
// 4. 哈希比较防止时序攻击
return hash_equals($sign, $verifySign);
}
}
// 使用示例
$appSecret = 'your_app_secret_here_32chars';
$security = new如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。
PHP API 接口数据加密传输与签名校验
用户现在需要我写一篇符合要求的PHP技术文章,首先得理清楚结构,首先是背景问题,就是API传输的时候常见的问题,比如数据被窃听、篡改,还有重放攻击这些,得先讲清楚痛点,比如现在很多前后端分离、第三方接口调用,明文传肯定不行,还有没签名的话被篡改了都不知道。
然后是方案对比,得列几个常用的方案,不能只讲一个,比如第一个是HTTPS+参数签名,这个是最常用的,然后第二个是参数加密+AES/RSA,还有第三个是JWT?不过JWT其实更多是身份,不过也可以提,然后每个方案的优缺点,适用场景,比如HTTPS是基础,但是如果有中间人或者需要额外校验的话要加签名,然后加密的话适合敏感数据,比如身份证、银行卡这些,然后方案对比要清晰,比如列个表格?或者分点说,每个方案的适用场景,优缺点。
然后是代码示例,得是可运行的,比如选最常用的HTTPS+参数签名的实现吧?因为大部分场景都用这个,代码里要包含生成签名和校验签名的部分,用PHP写,要注意用到的函数,比如hash_hmac,还有排序参数,排除空值和sign参数,然后还要有时间戳和nonce防重放?对,这样更实用。
然后是总结与建议,还有生产环境落地检查清单,这个要符合要求,用检查清单的形式,比如检查项1:是否强制HTTPS,2:签名算法是否用强哈希,3:是否加时间戳和nonce防重放,4:敏感数据是否加密,5:密钥是否定期轮换这些。
然后结尾要自然引出那个链接,说本文由PHP加密服务团队整理发布,原文出处和更多实践见那个网址。
首先标题就用要求的「PHP API 接口数据加密传输与签名校验:方案对比与选型建议」。
然后开头背景部分,要讲实际场景,比如现在企业级应用里,API调用分内部服务调用、第三方开放平台、移动端/小程序端调用,常见的问题:1. 明文传输被窃听,比如用户信息、支付数据泄露;2. 参数被篡改,比如订单金额被改;3. 重放攻击,比如重复提交支付请求。然后说很多人要么全依赖HTTPS,要么过度加密,性能差,所以需要选合适的方案。
然后方案对比部分,分三个主流方案:
方案一:HTTPS + 参数签名(最通用)
原理:HTTPS做传输层加密,防止窃听;参数签名做应用层校验,防止篡改、重放。
优点:实现简单,性能损耗低,兼容性好,适合绝大多数场景。
缺点:敏感数据如果被HTTPS解密后还是明文,需要额外加密。
适用场景:内部服务调用、第三方开放平台、普通业务接口。
方案二:参数对称加密(AES) + 签名
原理:敏感参数用AES加密,传输层用HTTPS,加上签名校验。
优点:敏感数据即使被解密也无法直接读取,安全性更高。
缺点:密钥分发麻烦,性能比纯签名略低,需要处理加密解密逻辑。
适用场景:涉及身份证、银行卡、支付密码等高度敏感数据的接口。
方案三:非对称加密(RSA) + 签名
原理:敏感数据用接收方公钥加密,发送方用私钥签名,接收方用公钥验签。
优点:无需传输对称密钥,密钥分发更安全,适合跨组织、跨信任域的接口调用。
缺点:性能损耗高,实现复杂,适合小数据量的敏感接口。
适用场景:第三方支付回调、跨企业数据对接等信任度低的场景。
然后是代码示例,选方案一的实现吧,因为最常用,代码要可运行,包含生成签名和校验签名的两个方法,还要有时间戳和nonce防重放的部分,比如: