PHP 怎么包签名

wen PHP项目 2

本文目录导读:

PHP 怎么包签名

  1. Composer 包的签名(最常见)
  2. PHP 代码签名(Phar 包签名)
  3. HTTP API 签名(JWT / HMAC)
  4. 代码完整性校验(自定义)
  5. Composer 安全签名(P2P 下载)
  6. 总结建议

在 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 + 代码扫描

如果你说的“包签名”是其他含义,请补充具体场景,我会给出更精准的解决方案。

抱歉,评论功能暂时关闭!