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

我在我的数据库中创建了一个用户表,其中包含用于保存用户信息的不同列.我还添加了两列public_key和private_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"];

创建一个随机密钥对并将其提供给用户,以便每个用户都有一个密钥对.

我希望我的用户具有数字签名功能,因此当他们上传文件时,他们会签名.

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

openssl_pkcs7_sign("msg.txt", "signed.txt", "signing_cert.pem",

array("private_key.pem", "mypassphrase"),

array()

);

问题是:sign_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,digital-signature

来源: https://codeday.me/bug/20190530/1184083.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值