You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用phpseclib通过private.pem签名并借助public.crt验证签名?

使用phpseclib实现RSA签名与验证

嗨,这事儿用phpseclib做起来挺顺手的,你给出的代码骨架已经很到位了,我再给你补全细节和一些实用提示,让整个流程更稳:

第一步:先安装phpseclib

首先得确保你已经通过Composer安装了phpseclib,要是还没装,跑这条命令就行:

composer require phpseclib/phpseclib

核心实现代码

下面是完善后的代码,我加了注释和一些安全相关的配置,你可以直接用:

<?php
use phpseclib3\Crypt\RSA;

// 要签名的原始数据
$data = 'test';

// 1. 加载私钥并签名
$rsa = new RSA();
// 读取私钥文件(如果私钥带密码,第二个参数传密码即可,比如$rsa->loadKey($privatekey, 'your_password'))
$privateKeyContent = file_get_contents(storage_path('app/private.pem'));
$rsa->loadKey($privateKeyContent);

// 推荐指定更安全的哈希算法,比如SHA-256(默认可能是SHA-1,安全性较低)
$rsa->setHash('sha256');
// 执行签名,默认返回二进制格式,要是需要Base64编码的签名,后续可以用base64_encode($signed)
$signedData = $rsa->sign($data);

// 2. 加载公钥证书并验证签名
$rsa->loadKey(file_get_contents(storage_path('app/public.crt')));
// 同样要确保验证时用的哈希算法和签名时一致
$rsa->setHash('sha256');

// 验证签名,返回true则验证通过,否则失败
$isVerified = $rsa->verify($data, $signedData);

echo $isVerified ? '签名验证通过' : '签名验证失败';
?>

一些关键提示

  • 私钥密码处理:如果你的private.pem是加密的(带密码),记得在loadKey方法里传入第二个参数作为密码。
  • 哈希算法选择:一定要用SHA-2及以上的算法(比如SHA-256、SHA-512),别用SHA-1,因为SHA-1已经被证明不安全了。
  • 签名格式:sign方法默认返回二进制签名,要是你需要把签名存到数据库或者通过接口传输,建议用base64_encode($signedData)转成Base64字符串,验证的时候再用base64_decode($signedData)转回来。
  • 证书格式:确保public.crt是PEM格式的证书,要是你拿到的是DER格式,可以先转成PEM再使用。

常见问题排查

如果验证失败,先检查这几点:

  • 私钥和公钥/证书是不是配对的?别搞混了不同密钥对的文件。
  • 签名后的原始数据有没有被修改?哪怕一个空格都可能导致验证失败。
  • 签名和验证时用的哈希算法是不是完全一致?
  • 公钥证书有没有损坏?可以用openssl x509 -in public.crt -text -noout命令检查证书是否有效。

内容的提问来源于stack exchange,提问作者Nico Penaredondo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:06:21