我需要一些帮助以下"伪"代码:
<?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日
答案 0 :(得分:0)
error:0906D06C:PEM routines:PEM_read_bio:no start line
是非致命的。这意味着它没有找到证书以及私钥,因为在这种情况下只有公钥/私钥。
openssl_verify()
在失败时返回-1
,如果签名正确则返回1
,如果错误则返回0
。因此,您应该检查所有3个值,而不仅仅是真或假。
您应该检查openssl_verify
的{{1}}的返回值,表示失败。如果它返回-1
,则密钥有效,但签名无效,数据被篡改,或者使用了错误的公钥进行验证。
这是一个充分说明的例子:
0