PHP:openssl_verify不使用ECDSA密钥

时间:2016-04-05 18:04:35

标签: php openssl sha256 ecdsa

我需要一些帮助以下"伪"代码:

<?php

$stringToVerify = '50.009781OK101092014125505';
$ECDSA =     '3045022100b4b4064158cb12f5b3d902e1e4487e0c6dfafd96b5bb5ab9765fc088e054d67e0220153    f9bb5da20441c68ff0c3e8ba28cfe048e5c3152fc8c890def156cf09d5540';
$publicKey = "-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaq6djyzkpHdX7kt8DsSt6IuSoXjp
WVlLfnZPoLaGKc/2BSfYQuFIO2hfgueQINJN3ZdujYXfUJ7Who+XkcJqHQ==
-----END PUBLIC KEY-----";

var_dump(openssl_verify($stringToVerify, pack("H*", $ECDSA), $publicKey,     OPENSSL_ALGO_SHA256));
var_dump(openssl_error_string());

openssl_verify()将始终返回非TRUE值,openssl_error_string()将返回错误消息:&#39;错误:0906D06C:PEM例程:PEM_read_bio:无起始行&#39;

哪里可能有问题?为什么openssl_verify()不会返回TRUE?

OpenSSL版本是1.0.1r 2016年1月28日

1 个答案:

答案 0 :(得分:0)

error:0906D06C:PEM routines:PEM_read_bio:no start line是非致命的。这意味着它没有找到证书以及私钥,因为在这种情况下只有公钥/私钥。

openssl_verify()在失败时返回-1,如果签名正确则返回1,如果错误则返回0。因此,您应该检查所有3个值,而不仅仅是真或假。

您应该检查openssl_verify的{​​{1}}的返回值,表示失败。如果它返回-1,则密钥有效,但签名无效,数据被篡改,或者使用了错误的公钥进行验证。

这是一个充分说明的例子:

0