php 实现签名
PHP 实现签名的基本方法
在 PHP 中实现签名通常用于数据完整性验证、身份认证或 API 安全。以下是常见的签名实现方式:
HMAC 签名
使用哈希消息认证码(HMAC)生成签名,适用于 API 请求验证:
$secretKey = 'your-secret-key';
$data = 'message-to-sign';
$signature = hash_hmac('sha256', $data, $secretKey);
RSA 签名
使用非对称加密算法生成签名:
$privateKey = openssl_pkey_get_private('file://path/to/private.key');
$data = 'message-to-sign';
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
$signature = base64_encode($signature);
URL 安全签名
生成可用于 URL 的安全签名:
$data = ['param1' => 'value1', 'param2' => 'value2'];
ksort($data);
$queryString = http_build_query($data);
$signature = md5($queryString . 'your-salt');
签名验证方法
HMAC 验证
$receivedSignature = $_SERVER['HTTP_SIGNATURE'];
$computedSignature = hash_hmac('sha256', $requestBody, $secretKey);
if (hash_equals($computedSignature, $receivedSignature)) {
// 验证通过
}
RSA 验证
$publicKey = openssl_pkey_get_public('file://path/to/public.pem');
$data = 'original-message';
$signature = base64_decode($receivedSignature);
$valid = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
注意事项
- 始终使用安全的哈希算法(如 SHA256、SHA512)
- 对于 HMAC,密钥应足够长且随机
- 考虑添加时间戳防止重放攻击
- 在比较签名时使用
hash_equals()防止时序攻击 - 敏感信息不应仅依赖签名,应结合其他安全措施
完整示例(API 签名)
function generateApiSignature($params, $secret) {
ksort($params);
$query = http_build_query($params);
return hash_hmac('sha256', $query, $secret);
}
function verifyApiSignature($receivedSig, $params, $secret) {
$expectedSig = generateApiSignature($params, $secret);
return hash_equals($expectedSig, $receivedSig);
}






