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 |