如何通过在OpenSSL命令行上创建的PHP验证签名?

时间:2010-12-15 01:04:24

标签: php cryptography openssl

由于大小限制,似乎PHP的openssl_signopenssl_verify函数在签名之前执行数据散列,所以我尝试在命令行上模拟它。

通过openssl签名:

echo "foo" | openssl dgst -sha1 -binary | openssl rsautl -inkey priv.pem -sign > sig.bin

然后通过PHP验证

$key = openssl_pkey_get_public('pub.pem');
$ver = openssl_verify( "foo\n", file_get_contents('sig.bin'), $key, OPENSSL_ALGO_SHA1 );
// $ver always 0

我尝试了很多组合,二进制和十六进制形式的哈希,有和没有尾随换行符,甚至在传入php函数之前进行散列

1 个答案:

答案 0 :(得分:0)

我的发现是,PHP的签名和验证不能与openssl的rsautl -sign-verify选项互操作。 PHP似乎添加了一些元数据(额外的15个字节),虽然我不知道它意味着什么。

我的解决方案: 我直接使用加密和解密函数并自己处理哈希。

这样,命令行-verify选项类似于“使用公钥解密”。 同样,-sign类似于“使用公钥加密”

事实上,通过这种方式,您可以定义自己的签名格式,例如包含日期和散列