php - 如何在 PHP 中对文件进行数字签名

标签 php digital-signature

我在我的数据库中创建了一个user 表,其中包含用于保存用户信息的不同列。我还添加了两列 public_keyprivate_key。 当用户注册时,他的信息将被插入到表中。另外我正在使用:

// Create the keypair
$res=openssl_pkey_new();

// Get private key
openssl_pkey_export($res, $privatekey);

// Get public key
$publickey=openssl_pkey_get_details($res);
$publickey=$publickey["key"];

创建一个随 secret 钥对并将其提供给用户,以便每个用户都有一个 key 对。 我希望我的用户具有数字签名能力,这样当他们上传文件时就可以签名。

我决定先签署一个示例文件 (msg.txt) 看看是否可以,然后再继续。它看起来直截了当:

openssl_pkcs7_sign("msg.txt", "signed.txt", "signing_cert.pem",
array("private_key.pem", "mypassphrase"),
array()
);

问题是:signing_cert.pem 和 private_key.pem 是什么?我将生成的公钥粘贴到 signing_cert.pem 中,将私钥粘贴到 private_key.pem 中,但我看到了这个错误:

Warning: openssl_pkcs7_sign() [function.openssl-pkcs7-sign]: error getting 
private key in /home/ofathian/public_html/msc/ebook/mine/assymetric-test.php 
on line 40

如有任何意见,我们将不胜感激。

最佳答案

我得出了为什么不制作自己的数字签名功能的结论。

数字签名算法的工作原理如下: 首先对纯文本进行散列,然后用用户的私钥加密,然后是结果 与纯文本连接。

伪代码:

return [input + encrypt(md5(input),private_key)]

用于验证:输入被拆分为纯文本和签名。然后签名被解密 使用公钥。然后将结果与纯文本的哈希进行比较,如果它们 相等则表示签名已通过验证。

伪代码:

explode(input) --> plain_text , signature
if( decrypt(signature,public_key) == md5(plain_text) ) then signature is trusted

现在是我测试过并正在使用的真实 PHP 代码:

function sign($cleartext,$private_key)
{
    $msg_hash = md5($cleartext);
    openssl_private_encrypt($msg_hash, $sig, $private_key);
    $signed_data = $cleartext . "----SIGNATURE:----" . $sig;
    return mysql_real_escape_string($signed_data);
}

function verify($my_signed_data,$public_key)
{
    list($plain_data,$old_sig) = explode("----SIGNATURE:----", $my_signed_data);
    openssl_public_decrypt($old_sig, $decrypted_sig, $public_key);
    $data_hash = md5($plain_data);
    if($decrypted_sig == $data_hash && strlen($data_hash)>0)
        return $plain_data;
    else
        return "ERROR -- untrusted signature";
}

关于php - 如何在 PHP 中对文件进行数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9707794/

相关文章:

php - 使用预哈希密码批量导入 wordpress 用户

java - pdfbox 1.8.8 视觉签名

ruby - 在 Ruby 中规范化 XML

c++ - 检查 DLL 是否已签名 C++

php在浏览器中打开fdf文件

php - 将代码添加到图标 Yii 中

php - 带有附加数据的 jQuery 文件上传

javascript - Ajax - 处理正确的数组以传递给 PHP

digital-signature - p7s 文件的内容

windows - 如何对 Inno Setup 生成的卸载文件进行数字签名?