跳转到内容

签名与加密安全模型

本页说明核心引擎提供的两类密码学接口的安全模型:文档加密(AES-256)与文档签名(CMS/PAdES)。它说明每种机制保护什么、不保护什么,以及信任边界位于何处。

边界。 支持某项密码学机制,并不保证它在你的部署环境中安全。已加密文档的强度取决于你选择的密码与密钥保管方式。一份签名的意义取决于证书、信任锚点、时间戳授权单位,以及验证者的策略。证书、信任锚点、 时间戳授权单位与验证者策略,全都位于本库之外。本页描述的是机制;它并不为结果背书。

Terminal window
composer require nextpdf/core:^3

ext-openssl 是签名与 CMS 路径所必需的。

加密在核心引擎中对应 ISO 32000-2 §7.6 的 AES-256 安全处理器(AESV3,Revision 6)(iso32000_2_sec7#x1.x65.p29)。它提供机密性:没有密码的一方无法读取字符串与流内容。它提供完整性或真实性。密文仍可能被截断或被替换。检测被截断或被替换的密文,是签名或文档 MAC 的职责,而不是加密处理器的职责。

权限(打印、复制、修改)是另一个概念,也是常见的信任陷阱。ISO 32000-2 的权限标志属于阅读器配合性质iso32000_2_sec7#x1.x71.p27)。符合规范的阅读器会遵守它们,但它们只是建议性元数据,而非密码学访问控制。不配合的工具可以忽略它们。引擎会如实写出这些标志;但无法强制执行它们。

签名是一个 CMS SignedData 结构,按 ISO 32000-2 §12.8 内嵌。被签名的字节范围是一个直接对象,而摘要刻意排除签名的 Contents 值(iso32000_2_sec12#x1.x121.p45),因此签名涵盖文档,但不涵盖签名本身。

本页不重复列出签名 API。加密入口点与签名编排器,分别记录于 /modules/core/security//modules/core/security/signing/。这里的模型讨论的是意义与边界,而非方法形态。

加密提供的只是面向没有密码一方的机密性保护 —— 仅此而已:

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = new Document();
// AES-256 (AESV3 R6). The owner/user passwords gate read access only.
// Permission flags below are advisory: a conforming reader honors them.
$doc->encrypt(
userPassword: 'open-secret',
ownerPassword: 'owner-secret',
);
$doc->save('confidential.pdf');

生产环境的签名流程会使用软件持有的密钥生成 CMS/PAdES 基线签名。Core 版会生成 PAdES B-B 级别。配置时间戳授权单位后,Core 版会生成 PAdES B-T,也就是在 B-B 基础上增加单个 RFC 3161 signature-time-stamp 未签名属性:

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
use NextPDF\Security\Signature\CertificateInfo;
use NextPDF\Security\Signature\SignatureLevel;
$cert = CertificateInfo::fromPkcs12('signer.p12', 'pin');
$doc = new Document();
// B-B is the default. B-T adds a trusted timestamp over the signature value.
$doc->setSignature($cert, SignatureLevel::PAdES_B_B);
$doc->save('signed.pdf');

PAdES B-T 正是在 B-B 基础上增加一个 RFC 3161 signature-time-stamp 未签名属性,并承载于 CMS 的 SignerInfo 之中(rfc5652#p603)。这个时间戳会把签名值绑定到从时间戳授权单位取得的可信时间(rfc3161#p208)。它不会加入验证数据字典、撤销信息结构或归档时间戳循环。那些是彼此独立、范围分开的长期级别,并非 B-B/B-T 接口的一部分,也不在本页范围内。

U-1。 NextPDF 并未主张针对 PAdES B-T 取得任何独立的 ETSI EN 319 142-1 认证。EN 319 142-1 不在此处所用的验证语料库中。B-T 的 signature-time-stamp 要求,是按 ETSI EN 319 122-1 §5.3 进行验证 —— 也就是 EN 319 142 的 PAdES 系列以引用方式导入的 CAdES 基础 (etsi_en_319_122_1#6.x40.p96)—— 并同时对照 RFC 3161、RFC 5652,以及 ISO 32000-2 §12.8。支持 B-T 配置文件,并不等同于符合性认证,也不等同于法律效力认证。该判定应由独立验证者作出。

  • 加密 ≠ 完整性。 即使阅读器能打开文档,它打开的仍可能是一份遭篡改的副本。只有签名(或文档 MAC)才能检测到这种情况。「防篡改」并不是加密处理器提供的性质,本产品也不会使用该词作出宣称。
  • 签名存在不等于签名有效。 文档带有签名字典,并不能说明证书是否受信任、是否未过期,或是否未被撤销。确立有效性是验证端的操作,受信赖方策略约束,而非由签名者决定。
  • 时间戳的信任在外部。 一个 B-T 时间戳的意义,仅取决于验证者对签发该时间戳的时间戳授权单位所赋予的信任。库负责取得并内嵌该令牌,但并不为该 TSA 背书。
  • FIPS 态势属于环境层面。 在通过 FIPS 验证的密码学模块上运行,是运行环境与模块本身的性质(fips_140_3#x12),而不是 PHP 库能够替调用端主张的属性。

签名路径会计算字节范围摘要,并生成一个 CMS 结构。B-T 扩展会向时间戳授权单位发起一次额外的同步往返。加密是一种 per-string/per-stream 的对称运算。两者通常都不会主导一次典型渲染。B-T 的网络往返才是可变成本,且取决于调用端选择的 TSA。

以下将边界陈述重新整理为审查者可执行的规则:

  1. 仅限机密性。 AES-256 加密保护内容,使没有密码的一方无法读取。它不提供完整性、真实性,也不提供访问控制(iso32000_2_sec7#x1.x65.p29)。
  2. 权限属建议性质。 权限标志属于阅读器配合性质,并未在密码学上强制执行(iso32000_2_sec7#x1.x71.p27)。没有任何产品用语会宣称它们能够阻止某项操作。
  3. 本页仅涵盖 B-B 与 B-T。 此处所记录的 core/Pro 签名接口涵盖 B-B 及其 B-T 时间戳扩展,每一处提及 B-T 都与上方的 U-1 警示语并列。长期归档级别属于另一个付费版本的接口,有意不在此处描述。本页并未主张任何验证数据、撤销信息或归档时间戳能力。
  4. 不主张法律效力。 所生成的签名是密码学产物。它是否具有法律效力,取决于管辖区、证书策略与信赖方 —— 而不取决于本库。

支持不等于符合。引擎所生成的输出,使用了所引用的 ISO 32000-2、RFC 3161、RFC 5652 与 ETSI EN 319 122-1 结构。引擎并不主张 PAdES、CAdES 或 eIDAS 符合性。FIPS 140-3 验证是 module/environment 的性质(fips_140_3#x12),而非本库的主张。任何符合性或法律效力判定,都由独立的验证者或评估者作出。