Security

Security

Эта страница охватывает пароли, шифрование и цифровые подписи. Document.OpenFile() / Document.Open() принимают пароль для открытия защищённого документа, Document.Save() принимает параметр encrypt для защиты, а Document.Sign() / Document.Certify() / Document.VerifySignatures() добавляют и проверяют цифровые подписи.


Открытие и расшифровка документов, защищённых паролем

Передайте { password: '...' } в Document.OpenFile() или Document.Open(), чтобы открыть документ, защищённый пользовательским паролем. Если пароль отсутствует или неверен, вызов генерирует InvalidPasswordError.

import { Document, InvalidPasswordError } from '@asposefoss/pdf';

try {
  const doc = Document.OpenFile('secret.pdf', { password: 'hunter2' });
  doc.WriteTo('decrypted.pdf');    // output is plaintext
} catch (e) {
  if (e instanceof InvalidPasswordError) console.error('wrong password');
  else throw e;
}

Шифрование при сохранении

Document.Save() (и Document.WriteTo()) принимают параметр encrypt. Шифрование на основе пароля является обычным случаем; библиотека также поддерживает шифрование с помощью открытого ключа для одного или нескольких сертификатов получателя, которое открывается снова с помощью личного ключа получателя.

// Encrypt to one or more recipient certificates (PEM string or DER bytes):
const bytes = doc.Save({
  encrypt: {
    recipients: [{ certificate: recipientCertPem }],
    algorithm: 'aes256',                 // 'aes256' (default) | 'aes128' | 'rc4'
    permissions: { copying: false },     // shared across all recipients
  },
});

// Open with the recipient's private key + certificate, or a PKCS#12 bundle:
const opened = Document.Open(bytes, {
  recipient: { privateKey, certificate: recipientCertPem },
});
console.log(opened.Permissions);         // recovered permission flags (not enforced)

Подписание и сертификация

Document.Certify() добавляет сертификационную (авторскую) подпись, содержащую трансформацию DocMDP, которая объявляет, какие последующие изменения разрешены; Document.Sign() добавляет ещё одну обычную подпись одобрения, которую можно последовательно добавлять сверху. Обе принимают { certificate, privateKey } подписанта и объект параметров (reason, location, name, fieldName, и— для Certify()— permissions).

const certifying = Document.OpenFile('report.pdf');
await certifying.Certify(
  { certificate: author.certificate, privateKey: author.privateKey },
  { permissions: 'form-fill', reason: 'Certifying the report', fieldName: 'Certification' },
);
const certifiedBytes = certifying.Save();

const approving = Document.Open(certifiedBytes);
await approving.Sign(
  { certificate: approver.certificate, privateKey: approver.privateKey },
  { reason: 'Approved for publication', fieldName: 'Approval' },
);
approving.WriteTo('signed.pdf');

Проверка подписей

Document.VerifySignatures() проверяет каждую подпись в документе: он пересчитывает каждый /ByteRange дайджест, проверяет отделённый CMS и сообщает, что изменилось после каждой подписи. Он возвращает SignatureReport[], одну запись на подпись.

const reports = await Document.OpenFile('signed.pdf').VerifySignatures();
for (const r of reports) {
  console.log(r.name, 'integrity:', r.integrity, 'signature:', r.signature);
}

Советы и лучшие практики

  • Отлавливайте InvalidPasswordError конкретно до более общего перехвата при открытии ненадёжного ввода, чтобы можно было реагировать по-разному на неверный пароль и на повреждённый файл.
  • Вызовите Certify() перед любыми вызовами Sign()— сертификационная подпись устанавливает DocMDP разрешения, на которые позже накладываются подписи одобрения.
  • Document.Open() возвращает восстановленные Permissions после дешифрования открытым ключом, но сама библиотека их не принуждает— рассматривайте их как информационные.
  • VerifySignatures() является async— await её (или обработайте возвращённый Promise) перед чтением массива отчётов.

Общие проблемы

ПроблемаПричинаИсправление
Document.OpenFile() / Document.Open() выдает InvalidPasswordErrorДокумент защищён паролем, и пароль не был предоставлен, либо был указан неверныйПередайте { password: '...' } в Document.OpenFile() / Document.Open()
Не удалось расшифровать открытым ключомБыл передан неверный закрытый ключ или сертификат, либо ни один из них не соответствует любой записи recipients, использованной во время шифрованияПодтвердите, что recipient параметр privateKey / certificate (или пакет PKCS#12) соответствует одному из исходных получателей
Подпись одобрения аннулирует сертификациюSign() был вызван с разрешениями, которые сертифицирующее преобразование DocMDP не допускаетУстановите значение permissions для Certify() (например, 'form-fill'), достаточно широкое для изменений, которые позже внесут подписанты
VerifySignatures() сообщает о нарушенной проверке целостностиПодписанные байты были изменены после подписи, за пределами инкрементного обновления, покрываемого подписьюПодпишите документ заново после любых дальнейших правок

FAQ

В чём разница между Sign и Certify?

Certify() добавляет первую, сертификационную подпись и объявляет (через преобразование DocMDP), какие последующие изменения разрешены. Sign() добавляет обычную подпись-утверждение, добавляемую последовательно поверх того, что было ранее.

Как открыть PDF, защищённый паролем?

Передайте { password: '...' } в Document.OpenFile() или Document.Open() и поймайте InvalidPasswordError, если пароль может быть неверным.

Применяет ли эта библиотека ограничения флагов разрешений PDF?

Нет. Document.Open() восстанавливает флаги Permissions из зашифрованного документа для вашего просмотра, но сама не ограничивает, что ваш код может делать с открытым документом.

Как проверить, остаются ли подписи подписанного PDF действительными?

Вызовите Document.VerifySignatures() (метод async) и проверьте поля integrity и signature у каждого возвращённого SignatureReport.


API Reference Сводка

Класс/МетодОписание:
Document.OpenFile() / Document.Open()Откройте документ, при необходимости защищённый паролем или открытым ключом
InvalidPasswordErrorВыбрасывается, когда пароль отсутствует или неверен
Document.Save() / Document.WriteTo()Сохраните документ, при необходимости с опцией encrypt
PermissionsВосстановленные флаги разрешений из зашифрованного документа
Document.Certify()Добавить подпись сертификата (автора) с трансформацией DocMDP
Document.Sign()Добавить подпись одобрения
Document.VerifySignatures()Проверить каждую подпись в документе
SignatureReportРезультат проверки одной подписи: name, integrity, signature

См. также:

 Русский