以下PHP函数使用$data
验证$key
字符串是否已签名以创建$signature
:
<?php
$result = openssl_verify( $data , $signature , $key , OPENSSL_ALGO_SHA1 );
?>
是否有相同的PHP函数,如果我有正确的$data
和$signature
$key
字符串
答案 0 :(得分:1)
我认为OP对我理解的签名过程存在误解,因为我也有。
简短的回答是:不,没有这样的PHP功能,因为它是不可能的。
数字签名不仅仅是使用私钥加密的原始邮件($ data)。
将原始邮件散列到“邮件摘要”中,然后使用私钥加密。 如果您使用匹配的公钥解密签名,您实际上将获得“消息摘要”。
但是无法从“消息摘要”中获取原始消息,因为散列过程是设计的一种方式。
验证签名是使用相同散列函数散列$ data的过程,并将其与使用公钥解密签名获得的“消息摘要”进行比较。
我猜这就是openssl_verify的php函数。
这个页面帮助我理解: http://www.youdzone.com/signature.html
答案 1 :(得分:0)
$data
是原始的$data
字符串,这是openssl_verify调用的作用 - 使用$data
和{{1}验证$signature
是否未更改}
如果您询问是否可以使用$key
生成数据,则不会 - 即使您拥有私钥,您仍然无法重新创建数据。
想象一下,如果你有一张签名的物理文件(如遗嘱)和一张签名卡。虽然签名卡($signature
)允许您验证签名是否可信($key
),但签名不能用于重新创建文档的原始内容(例如,如果墨水溢出)即使您是文档的原始签名者,也要跨越文档的顶部,而不是跨越签名行。它只能用于验证文件(Will)实际上已签名(具有法律约束力)。
从数学角度来看,数字签名有点复杂,并提供了一些略有不同的身份验证机制,但在这种情况下结果是相同的 - 签名不能用于重新创建原始文档,即使你有签名卡($signature
),即使你有私钥。