11

我需要知道是否可以使用 RSA、证书等对任何类型的文件进行数字签名,或者是否只能对某些类型的文件进行签名。所有这一切,使用 PHP。

例如:可以对纯文本文件进行数字签名吗?图像(png、jpeg、bmp)呢?

我不需要“附加”带有图形签名的图像。

谢谢您的帮助。

4

3 回答 3

23

回复:任何类型的文件都可以使用 RSA、证书等进行数字签名,还是只能对某些类型的文件进行签名?

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

但随后问题变成了:

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

  2. 一旦您拥有数字签名的数据及其签名,接收者如何验证数据及其签名以确保接收者知道谁签署了数据(身份),并且数据自签名后没有更改(完整性)?

支持数字签名的文件格式

本质上支持数字签名的文件格式的一大优势是,收件人可以通过接收签名文件然后使用他们自己的验证软件来验证数字签名和文件的完整性。收件人不需要从发件人安装任何东西。

有许多支持数字签名的文件格式。例如,pdf、Word .doc、.docx。Excel .xls、.xlsx。有一个用于签署 xml 文件的标准。它的好处是 xml 可以用作任何类型数据的信封。例如,可以对 pdf 文件进行数字签名并发送给某人。然后收件人可以使用标准/免费的 Adob​​e Reader 打开 pdf 并验证其数字签名。

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

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

于 2013-03-28T13:18:21.133 回答
8

使用phpseclib,一个纯 PHP RSA 实现在此处更新):

<?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 
于 2012-05-03T17:57:08.393 回答
1

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

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

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

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

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

于 2012-05-02T05:08:43.457 回答