PKCS
PKCS#7 описывает синтаксис для создания объектов, содержащих защищённые данные. Основная идея заключается в том, что сообщение может включать:
Формат основан на ASN.1 и кодируется чаще всего в DER или PEM представлении. Это обеспечивает совместимость между различными криптографическими библиотеками и системами.
PKCS#7 поддерживает несколько типов структур:
На практике наибольшее распространение получили SignedData и EnvelopedData.
CMS (RFC 5652) развивает PKCS#7, устраняя его ограничения и уточняя спецификацию. Основные изменения включают:
Несмотря на формальное обновление, термин PKCS#7 продолжает использоваться в прикладных системах, особенно в контексте подписи файлов, сертификатов и S/MIME сообщений.
Библиотека Jsrsasign реализует работу с PKCS#7 и CMS на уровне JavaScript, предоставляя инструменты для создания, анализа и проверки подписанных и зашифрованных структур.
Основные пространства имён, связанные с PKCS#7:
KJUR.asn1.cmsKJUR.crypto.CMSKJUR.crypto.PKCS7 (в зависимости от версии и
сборки)Библиотека позволяет:
Создание PKCS#7 подписи в Jsrsasign обычно строится вокруг приватного ключа и сертификата X.509.
Типовой процесс включает:
Пример структуры данных:
const sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(privateKey);
sig.updateString("Сообщение для подписи");
const signature = sig.sign();
После получения подписи она может быть упакована в PKCS#7 SignedData:
const pkcs7 = new KJUR.asn1.cms.SignedData({
version: 1,
hashalgs: ["sha256"],
content: "Сообщение для подписи",
certs: [certificate],
signerinfos: [{
version: 1,
id: { type: "isssn", cert: certificate },
sigalg: "SHA256withRSA",
signature: signature
}]
});
const pem = pkcs7.getPEM();
SignedData является наиболее важной частью PKCS#7 и CMS. Она включает:
Jsrsasign абстрагирует ASN.1 уровень, позволяя работать с объектной моделью.
PKCS#7 поддерживает два основных режима:
Подпись включает исходные данные внутри контейнера. Такой формат часто используется в архивных системах.
Данные не включаются в PKCS#7 структуру, а передаются отдельно. Это распространено в протоколах, где данные должны оставаться неизменными и независимыми от подписи.
В Jsrsasign режим определяется параметром content или отсутствием вложенного контента.
Процесс верификации включает:
Пример проверки:
const cms = new KJUR.asn1.cms.SignedData({ pem: pkcs7pem });
const result = cms.verify();
Результат проверки обычно включает информацию о валидности подписи и сертификатов.
PKCS#7 контейнер может содержать один или несколько сертификатов. Это позволяет передавать всю цепочку доверия вместе с подписью.
Jsrsasign предоставляет методы для:
const certs = cms.getCertificates();
Каждый сертификат представляет собой X.509 структуру с полями:
PKCS#7 EnvelopedData используется для шифрования данных для одного или нескольких получателей.
Принцип работы:
Jsrsasign поддерживает создание и разбор таких структур через CMS API.
Пример концептуального использования:
const cms = new KJUR.asn1.cms.EnvelopedData({
content: "Секретные данные",
recipients: [{
cert: recipientCert
}]
});
const pem = cms.getPEM();
PKCS#7 основан на ASN.1, что определяет строгую иерархию структуры:
ContentInfo
SignedData
Jsrsasign использует внутренние ASN.1 классы для построения этих структур, скрывая сложность кодирования DER.
PKCS#7 контейнеры могут быть представлены в двух основных форматах:
PEM формат в Jsrsasign выглядит следующим образом:
-----BEGIN PKCS7-----
MIIG...
-----END PKCS7-----
Конвертация между форматами выполняется автоматически при использовании соответствующих методов библиотеки.
PKCS#7 широко используется в S/MIME для:
Jsrsasign позволяет создавать структуры, совместимые с почтовыми клиентами, поддерживающими S/MIME.
Несмотря на широкое распространение, формат имеет ряд ограничений:
CMS устраняет эти ограничения, но PKCS#7 продолжает использоваться из-за обратной совместимости.
В JavaScript-экосистеме PKCS#7 через Jsrsasign применяется в задачах:
Jsrsasign предоставляет высокоуровневый интерфейс, скрывающий ASN.1 сложность и позволяющий работать с криптографическими структурами на уровне объектов JavaScript.