如何用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.txtVerified OK,说明实现完全正确。
可能踩的坑
- 确保你用的是phpseclib 2.x版本,3.x的API有变化,比如命名空间和类名会有些不同。
- 读取文件时注意文件编码,
file_get_contents会原样读取字节内容,和openssl处理文件的方式一致,不要额外转码。
内容的提问来源于stack exchange,提问作者LMIT
相关产品推荐
相关产品推荐

