示例签名php



我实现了一个例子(为了更好地理解我自己)数字签名是如何工作的(在我的例子中是php)

我使用了Bob和Alice在http://www.verisign.com.au/repository/tutorial/digital/intro1.shtml

中的"如何使用数字签名进行身份验证?"

"假设Alice想要发送一条签名消息给Bob。她通过对消息使用散列函数来创建消息摘要。消息摘要充当消息的"数字指纹";如果消息的任何部分被修改,散列函数返回一个不同的结果。然后Alice用她的私钥加密消息摘要。这个加密的消息摘要是消息的数字签名。Alice将消息和数字签名发送给Bob。当Bob收到它们时,他使用Alice的公钥解密签名,从而显示消息摘要。为了验证消息,他然后用Alice使用的相同的哈希函数对消息进行哈希,并将结果与他从Alice收到的消息摘要进行比较。如果它们完全相等,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;

我有三个问题:

1)关于签名如何工作的工作流程是否正确?我应该改变什么(如前所述,我不想生成"正确的".pem,。CRT等键…这将是我的下一步)。

2)在我的理解中,私钥总是用来解密的。用于加密的公钥。我知道这里的措辞是为私钥签名,并用公钥进行验证。显然,我可以在本例中仅使用公钥验证它。我不明白那是怎么回事。这怎么可能呢?也许你能给我一个更好的例子或链接?

3)我应该在我的实现中改变什么?

好吧,我来谈谈。

  1. 关于Alice和Bob的文本似乎是正确的,尽管最后一句"如果消息摘要不相等,消息要么来自其他地方,要么在签名后被更改"显然可以扩展为"或者消息用不同的私钥签名"。

  2. 的工作流程是正确的,虽然openssl_private_encrypt是有点太高的水平来显示什么是真正发生的。它可能会为签名生成执行填充,但不会对所使用的散列算法的OID进行编码(请参阅相当可读的pkcs# 1规范,以了解我所说的内容)。所以从这个意义上说,你的签名方案不太可能与其他任何东西进行验证。

  3. 所以很明显验证部分缺少实际的验证,你需要将结果哈希值与你在本地计算的哈希值进行比较。此外,你永远不应该使用MD5。也许你应该使用PSS填充方案,而不是旧的pkcs# 1 v1.5兼容方案。

相关内容

  • 没有找到相关文章

最新更新