从密钥和签名

时间:2015-05-01 20:14:30

标签: php openssl

以下PHP函数使用$data验证$key字符串是否已签名以创建$signature

<?php

    $result = openssl_verify( $data , $signature , $key , OPENSSL_ALGO_SHA1 );

?>

是否有相同的PHP函数,如果我有正确的$data$signature

,我可以获取原始的$key字符串

2 个答案:

答案 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),即使你有私钥。