本文目录导读:

在 PHP 中,“包签名”通常指的是代码签名,而不是包管理(如 Composer 包)的签名,但在不同场景下,含义有所不同,以下分常见场景说明:
Composer 包的签名(最常见)
如果你指的是给 Composer 包(库)做签名验证,通常有两种方式:
a) 使用 Composer 的 integrity 哈希校验
Composer 在 composer.lock 文件中会记录每个包的 hash,用于验证下载的包是否被篡改。
# 生成锁文件(包含哈希) composer update # 验证锁文件哈希 composer validate --no-check-publish
b) 包签名(数字签名)
通常使用 GPG 对包进行签名,但 Composer 原生不支持 GPG,需要自己实现。
示例:使用 GPG 签名包文件
# 生成 GPG 密钥(如果没配置) gpg --full-generate-key # 对包文件签名 gpg --detach-sign --output my-package.tar.gz.sig my-package.tar.gz # 验证签名 gpg --verify my-package.tar.gz.sig my-package.tar.gz
PHP 代码签名(Phar 包签名)
当你用 PHP 构建 Phar 归档(类似 Java 的 JAR)时,Phar 本身支持签名。
<?php
$phar = new Phar('myapp.phar');
$phar->buildFromDirectory('src/');
$phar->setStub('<?php Phar::mapPhar(); include "phar://myapp.phar/index.php"; __HALT_COMPILER();');
// 签名方式
$phar->setSignatureAlgorithm(Phar::SHA256); // 常用
// 或 SHA512、MD5、OPENSSL
签名算法支持
| 常量 | 说明 |
|---|---|
Phar::MD5 |
简单哈希 |
Phar::SHA1 (默认) |
安全哈希 |
Phar::SHA256 |
推荐 |
Phar::SHA512 |
更安全 |
Phar::OPENSSL |
需要 OpenSSL 私钥 |
OpenSSL 签名示例
<?php
$privateKey = file_get_contents('private.pem');
$phar = new Phar('signed.phar');
// ...构建内容...
$phar->setSignatureAlgorithm(Phar::OPENSSL, $privateKey);
HTTP API 签名(JWT / HMAC)
如果你的“包签名”是指 API 请求签名(比如微信支付、支付宝等),常见做法:
HMAC-SHA256 签名
<?php
function generateSignature($params, $secretKey) {
ksort($params); // 按字母排序
$stringToSign = http_build_query($params);
return hash_hmac('sha256', $stringToSign, $secretKey);
}
// 使用
$params = ['amount' => 100, 'order_id' => '123'];
$signature = generateSignature($params, 'your-secret-key');
$params['sign'] = $signature;
代码完整性校验(自定义)
如果你想对自己的 PHP 代码/包做完整性校验:
<?php
// 生成校验和
$files = glob('src/*.php');
foreach ($files as $file) {
echo $file . ' => ' . hash_file('sha256', $file) . PHP_EOL;
}
// 验证时比对
$expectedHash = '...';
$actualHash = hash_file('sha256', $file);
if ($expectedHash === $actualHash) {
echo "文件未被篡改\n";
} else {
echo "文件已被修改\n";
}
Composer 安全签名(P2P 下载)
Composer 从 2.x 开始支持 Packagist 下载时的安全机制,包括:
composer audit(CVE 扫描)composer verify(验证依赖完整性)
# 验证依赖版本是否安全 composer audit # 检查 Composer 配置的安全性 composer diagnose
总结建议
| 你的需求 | 推荐方案 |
|---|---|
| Composer 包发布 | 用 GPG 签名或官方 composer 校验 |
| Phar 应用发布 | 用 Phar 内置签名(SHA256/OpenSSL) |
| API 请求签名 | HMAC-SHA256 或 JWT |
| 源码完整性 | Git 签名 + sha256 校验文件 |
| 安全审计 | Composer Audit + 代码扫描 |
如果你说的“包签名”是其他含义,请补充具体场景,我会给出更精准的解决方案。