由于大小限制,似乎PHP的openssl_sign
和openssl_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函数之前进行散列
答案 0 :(得分:0)
我的发现是,PHP的签名和验证不能与openssl的rsautl -sign
和-verify
选项互操作。 PHP似乎添加了一些元数据(额外的15个字节),虽然我不知道它意味着什么。
我的解决方案: 我直接使用加密和解密函数并自己处理哈希。
这样,命令行-verify
选项类似于“使用公钥解密”。
同样,-sign
类似于“使用公钥加密”
事实上,通过这种方式,您可以定义自己的签名格式,例如包含日期和散列