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

Дивіться також

 Українська