RSA-PSS (Probabilistic Signature Scheme) представляет собой вероятностную схему цифровой подписи, разработанную как более безопасная альтернатива классической PKCS#1 v1.5. Основная идея заключается в устранении детерминированности подписи RSA и введении случайности через соль (salt), что значительно усложняет атаки на структуру подписи и повышает устойчивость к криптоанализу.
В отличие от старого подхода, где подпись формируется по фиксированному шаблону, RSA-PSS использует вероятностное кодирование сообщения перед применением RSA-операции. Это делает каждую подпись уникальной даже для одинакового входного сообщения.
RSA-PSS строится на нескольких ключевых компонентах, каждый из которых играет важную роль в обеспечении криптографической стойкости:
Хэш-функция Используется для сжатия сообщения до фиксированной длины (например, SHA-256).
Соль (salt) Случайная последовательность байт, добавляемая к сообщению перед хэшированием. Это ключевой элемент, обеспечивающий вероятностность подписи.
MGF1 (Mask Generation Function) Функция генерации маски, основанная на выбранной хэш-функции. Она используется для расширения хэш-значений до необходимой длины.
EMSA-PSS encoding Специальная схема кодирования сообщения перед применением RSA-операции.
Классическая схема PKCS#1 v1.5 формирует подпись по строго заданному формату. Это создаёт несколько проблем:
RSA-PSS решает эти проблемы за счёт:
На уровне преобразований схема выглядит следующим образом:
Ключевой момент заключается в том, что даже одинаковые сообщения дают разные подписи из-за случайной соли.
Библиотека Jsrsasign предоставляет поддержку RSA-PSS через класс
KJUR.crypto.Signature. Основной алгоритм указывается явно,
включая выбор хэша и режима PSS.
Поддерживаемые варианты включают:
SHA256withRSAandMGF1SHA512withRSAandMGF1RSA-PSSПеред использованием подписи необходимо создать ключевую пару RSA:
const KEYUTIL = KJUR.KEYUTIL;
const rsaKey = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = rsaKey.prvKeyObj;
const publicKey = rsaKey.pubKeyObj;
Процесс подписи включает выбор алгоритма, настройку параметров PSS и выполнение операции:
const sig = new KJUR.crypto.Signature({
alg: "SHA256withRSAandMGF1",
prov: "cryptojs/jsrsa"
});
sig.init(privateKey);
sig.updateString("Сообщение для подписи");
const signature = sig.sign();
Верификация выполняется аналогичным образом с использованием публичного ключа:
const sig = new KJUR.crypto.Signature({
alg: "SHA256withRSAandMGF1",
prov: "cryptojs/jsrsa"
});
sig.init(publicKey);
sig.updateString("Сообщение для подписи");
const isValid = sig.verify(signature);
Jsrsasign позволяет управлять ключевыми параметрами схемы:
Пример настройки:
const sig = new KJUR.crypto.Signature({
alg: "SHA256withRSAandMGF1",
prov: "cryptojs/jsrsa"
});
sig.setParameters({
"prng": "crypto",
"saltLength": 32
});
Увеличение длины соли повышает криптостойкость, но может снижать совместимость с некоторыми реализациями.
При вызове sign() библиотека выполняет следующие
этапы:
При проверке подписи выполняется обратный процесс с повторным вычислением хэша и сравнением структур.
RSA-PSS поддерживается большинством современных криптографических библиотек и стандартов:
Однако различия в параметрах (особенно salt length и hash algorithm) часто приводят к несовместимости. В Jsrsasign это требует строгого согласования конфигурации между сторонами.
При работе с RSA-PSS в реальных приложениях важны следующие аспекты:
В практических сценариях встречаются типичные проблемы:
Такие ошибки приводят к невозможности верификации даже при корректных данных.
RSA-PSS используется в:
Его распространение связано с переходом криптографической индустрии к моделям с доказуемой стойкостью и минимизацией детерминированных схем.
Jsrsasign одинаково работает как в браузере, так и в Node.js, поскольку реализует криптографию на Jav * aScript:
// Node.js или браузер
const KJUR = require("jsrsasign");
В браузере библиотека может подключаться через CDN:
<script src="https://cdn.jsdelivr.net/npm/jsrsasign"></script>
После подключения доступен полный набор API для RSA-PSS без необходимости использования нативных криптографических модулей.
RSA-PSS считается одной из наиболее надёжных схем RSA-подписи благодаря:
Эти свойства делают её стандартом де-факто в современных криптографических системах, где требуется высокая степень защиты цифровой подписи.