php签名示例
我实现了一个关于数字签名如何工作的示例(为了更好地理解自己)(在我使用php的例子中) 我使用了Bob和Alice的故事,标题是“如何使用数字签名进行身份验证?” 假设Alice想向Bob发送一条签名的消息。她通过对消息使用哈希函数来创建消息摘要。消息摘要用作“数字指纹”“电文的内容;如果修改了消息的任何部分,哈希函数将返回不同的结果。Alice然后用她的私钥加密消息摘要。此加密邮件摘要是邮件的数字签名。 Alice将消息和数字签名发送给Bob。当Bob收到它们时,他使用Alice的公钥解密签名,从而显示消息摘要。为了验证消息,他使用Alice使用的相同哈希函数对消息进行哈希,并将结果与从Alice收到的消息摘要进行比较。如果他们完全平等,Bob可以确信这条信息确实来自Alice,并且自她签字以来没有改变。如果消息摘要不相等,则消息可能来自其他地方,或者在签名后被更改(或者私钥不同)。” 在我发布代码之前,我想说的是,这可能不是不使用标准生成密钥的正确方法。但我应该让我(也许你)了解签名是如何工作的php签名示例,php,encryption,signature,Php,Encryption,Signature,我实现了一个关于数字签名如何工作的示例(为了更好地理解自己)(在我使用php的例子中) 我使用了Bob和Alice的故事,标题是“如何使用数字签名进行身份验证?” 假设Alice想向Bob发送一条签名的消息。她通过对消息使用哈希函数来创建消息摘要。消息摘要用作“数字指纹”“电文的内容;如果修改了消息的任何部分,哈希函数将返回不同的结果。Alice然后用她的私钥加密消息摘要。此加密邮件摘要是邮件的数字签名。 Alice将消息和数字签名发送给Bob。当Bob收到它们时,他使用Alice的公钥解密签名
echo "Example 2 <br><br>";
$res = openssl_pkey_new();
/* Extract the private key from $res to $privKey */
openssl_pkey_export($res, $privKey);
/* Extract the public key from $res to $pubKey */
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
$message = "Im a message";
echo "<br><br><strong>Public key:</strong><br>";
echo $pubKey;
echo "<br><br><strong>Private key:</strong><br>";
echo $privKey;
echo "<br><br><strong>Message:</strong><br>";
echo $message;
echo "<br><br><strong>Message digest:</strong><br>";
echo $md5message = sha1($message);
echo "<br><br><strong>Message digest encrypted(signature):</strong><br>";
openssl_private_encrypt($md5message, $crypted, $privKey);
echo $crypted;
echo "<br><br><strong>Bob uses sha1 as well for the message:</strong><br>";
echo $md5message = md5($message);
echo "<br><br><strong>Bob checks with decrypt(verify):</strong><br>";
openssl_public_decrypt($crypted, $decrypted, $pubKey);
echo $decrypted;
echo“示例2
”;
$res=openssl_pkey_new();
/*将私钥从$res提取到$privKey*/
openssl_pkey_导出($res,$privKey);
/*将公钥从$res提取到$pubKey*/
$pubKey=openssl\u pkey\u get\u详细信息($res);
$pubKey=$pubKey[“key”];
$message=“我是一条消息”;
echo“
公钥:
”;
echo$pubKey;
echo“
私钥:
”;
echo$privKey;
回显“
消息:
”;
回声$信息;
回显“
消息摘要:
”;
echo$md5message=sha1($message);
echo“
加密的邮件摘要(签名):
”;
openssl_private_encrypt($md5message,$crypted,$privKey);
回声加密;
echo“
Bob也使用sha1作为消息:
”;
echo$md5message=md5($message);
echo“
鲍勃使用解密(验证)进行检查:
”;
openssl_public_decrypt($crypted,$decrypted,$pubKey);
echo$已解密;
我有3个问题:
1) 签名工作流程是否正确?我应该更改什么(如前所述,我不想生成“正确的”。pem、.crt等键…将是我的下一步)
2) 在我的理解中,私钥总是用来解密的。用于加密的公钥。我知道这里的措辞是私钥的签名,并用公钥进行验证。显然,在这个示例中,我只能用公钥进行验证。我无法理解这一点。这怎么可能?也许你可以给我一个更好的示例或链接s
3) 我应该在我的实现中改变什么
提前谢谢。好的,我会说几句话
openssl\u private\u encrypt
的级别有点太高,无法显示实际发生的情况,但工作流基本上是正确的。它可能会为签名生成执行填充,但不会对所用哈希算法的OID进行编码(请参阅可读性较高的PKCS#1规范,以了解我所说的内容).因此,从这个意义上讲,您的签名方案不太可能与其他任何东西进行验证你能给我签名的十六进制编码、模数和公共指数吗?我很有兴趣在
openssl\u private\u encrypt
上做一些额外的测试。我不太清楚你的意思,因为它是动态生成的……我修正了措辞并在sha1中转换了md5。非常感谢你的建议。