如何使用PHP将数字签名(RSA,证书等)添加到任何文件?

时间:2012-05-02 04:00:06

标签: php file rsa digital-signature

我需要知道是否可以使用RSA,证书和那些东西,或者只有特定类型的文件可以签名,以数字方式签署任何类型的文件。所有这些,使用PHP。

例如:纯文本文件可以用数字签名吗?图像怎么样(png,jpeg,bmp)?

我不需要使用图形签名“附加”图像。

感谢您的帮助。

3 个答案:

答案 0 :(得分:10)

Re:可以使用RSA,证书和那些东西进行数字签名,或者只签署某种文件?

答:是的,不是。一方面,可以为任何比特束计算标准数字签名,包括纯文本文件,图像文件,二进制文件,您可以想象的任何东西。

然后问题就变成了:

  1. 如何将数字签名(本身就是二进制位运行)与数据文件相关联?数据文件格式是否允许将数字签名附加到数据中?或者您是否需要自己管理数字签名,可能作为单独的文件,也许使用您自己发明的数据格式?

  2. 获得经过数字签名的数据及其签名后,收件人如何验证数据及其签名,以确保收件人谁签署了数据(身份),并且数据自那时起未被更改签署(诚信)?

  3. 支持数字签名的文件格式

    本质上支持数字签名的文件格式的一大优势是,收件人只需接收签名文件然后使用自己的验证软件即可验证数字签名和文件的完整性。收件人无需安装发件人的任何内容。

    有许多支持数字签名的功能文件格式。例如,pdf,Word .doc,.docx。 Excel .xls,.xlsx。有一个standard for signing xml files。它的好处是xml可以用作任何类型数据的包络。例如,pdf文件可以进行数字签名并发送给某人。然后,收件人可以使用标准/免费的Adobe Reader打开pdf并验证其数字签名。

    纯文本文件(填充字符的文件)的“格式”不支持数字签名。因此,您需要一个文本及其数字签名的信封或单独处理数字签名。在任何情况下,收件人都需要您的软件来验证数据。 (或者在提供纯文本和签名的规范之后需要编写自己的。)

    S / MIME提供了一种标准方式,可以对文本或其他电子邮件/ mime组织数据进行数字签名。见rfc 5751。但除了可以生成或接收/验证签名电子邮件的电子邮件代理之外,它没有被广泛使用。 Outlook确实支持这一点。

答案 1 :(得分:8)

使用phpseclib, a pure PHP RSA implementation(已更新here):

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
extract($rsa->createKey());

$plaintext = 'terrafrost';

$rsa->loadKey($privatekey);
$signature = $rsa->sign($plaintext);

$rsa->loadKey($publickey);
echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified';
?>

使用CLI openssl的模拟如下:

openssl dgst -sha1 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -out signature.txt -sign privatekey.txt plaintext.txt 
openssl dgst -sha1 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -prverify privatekey.txt -signature signature.txt plaintext.txt 

答案 2 :(得分:1)

为什么要对这些不同的文件进行数字签名?

实际更改文本文件或图像没有标准,因此文件本身包含某种数字签名。

如果您想向用户保证文件未被篡改,您可以为他们提供该文件的MD5哈希值。他们可以使用免费工具检查他们下载的文件的MD5哈希值,并将其与您提供的文件进行比较,以确保他们的文件没有被更改。这通常用于第三方可以插入恶意代码的软件/二进制包。

另一种可能性是您希望用户能够验证某些文件的真实性。在这种情况下,用户可能希望确定文本文件或图像来自您。这个功能几乎就像获取一个只有您知道的私钥的文件的MD5哈希,以便最终用户可以将文件签名与您的公钥进行比较,以确保文件没有被篡改并来自特定的源。 PGP(非常好的隐私)为此提供了一个框架。

我建议您查看PGP简介文档以获取更多相关信息。 http://www.pgpi.org/doc/pgpintro/