【问题标题】:How to verify a signature via PHP that was created on the OpenSSL command line?如何通过 PHP 验证在 OpenSSL 命令行上创建的签名?
【发布时间】:2010-12-15 01:04:24
【问题描述】:

由于大小限制,似乎 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 函数之前进行哈希

【问题讨论】:

    标签: php cryptography openssl


    【解决方案1】:

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

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

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

    事实上,这样你可以定义自己的签名格式,例如在哈希中包含日期

    【讨论】:

    • pkeyutl 命令可以一步完成哈希和签名。
    • 谢谢,虽然我安装的 openssl (Mac) 没有这个实用程序
    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多