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

如何用phpseclib实现openssl dgst -sha1 -sign的等价功能?

用phpseclib 2.x实现等价于openssl dgst -sha1 -sign的功能

我完全懂你找资料碰壁的感受——作为加密领域新手,这种工具链对应确实容易摸不着头绪。刚好我用phpseclib 2.x做过一模一样的需求,给你直接上可运行的代码和拆解说明:

核心实现思路

你提到的openssl命令三步流程:生成SHA1哈希→ASN.1编码哈希→私钥签名,phpseclib的Crypt_RSA类已经帮你封装了后两步的细节,不用手动处理ASN.1编码,只需要配置好参数就能直接得到和openssl完全一致的签名结果。

完整代码示例

<?php
require_once 'vendor/autoload.php'; // 如果你用Composer加载phpseclib

use phpseclib\Crypt\RSA;

// 1. 初始化RSA实例并加载私钥
$rsa = new RSA();
$privateKeyContent = file_get_contents('private.rsa.pem');

// 如果私钥有密码保护,把密码作为第二个参数传进去
// $rsa->loadKey($privateKeyContent, 'your_private_key_password');
$rsa->loadKey($privateKeyContent);

// 2. 配置签名参数,对齐openssl的行为
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1); // openssl dgst -sign默认用PKCS#1 v1.5填充
$rsa->setHash('sha1'); // 指定哈希算法为SHA1

// 3. 读取要签名的数据并生成签名
$data = file_get_contents('data.in.txt');
$signature = $rsa->sign($data);

// 4. 把签名写入二进制文件(和openssl的-out signature.out.bin对应)
file_put_contents('signature.out.bin', $signature);
?>

关键细节解释

  • 为什么不用手动做ASN.1编码?:openssl的dgst -sign会自动把SHA1哈希和对应的算法OID(1.3.14.3.2.26)打包成ASN.1 DER结构,再用私钥签名。phpseclib的sign方法已经内置了这个逻辑,所以你只需要指定哈希算法,它会自动处理ASN.1的封装,和openssl的输出完全一致。
  • 私钥密码处理:如果你的私钥是加密的(生成时加了-des3之类的参数),加载的时候一定要把密码作为loadKey的第二个参数传入,否则会加载失败。
  • 验证签名:你可以用openssl命令验证phpseclib生成的签名是否有效,执行:
    openssl dgst -sha1 -verify public.rsa.pem -signature signature.out.bin data.in.txt
    
    如果输出Verified OK,说明实现完全正确。

可能踩的坑

  • 确保你用的是phpseclib 2.x版本,3.x的API有变化,比如命名空间和类名会有些不同。
  • 读取文件时注意文件编码,file_get_contents会原样读取字节内容,和openssl处理文件的方式一致,不要额外转码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:54:35