【问题标题】:How to add digital signature (RSA, Certificate, etc) to any of file, using PHP?如何使用 PHP 向任何文件添加数字签名(RSA、证书等)?
【发布时间】:2012-05-11 13:26:15
【问题描述】:

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: php file rsa digital-signature


    【解决方案1】:

    使用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 
    

    【讨论】:

    • 感谢您的回答。我测试了纯文本文件的数字签名,它工作正常。我还没有在二进制文件中测试过,因为我不确定数字签名是否会破坏文件。我会尝试phpseclib。
    • 我可以以任何方式将它用于文件吗?说像上传的图片?提前致谢
    • 当然——只要$plaintext = file_get_contents('filename.ext')
    【解决方案2】:

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

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

    但是问题变成了:

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

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

    支持数字签名的文件格式

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2017-06-05
        相关资源
        最近更新 更多