Работа с PS256, PS384, PS512

RSA-PSS и причины появления PS-алгоритмов

RSA-PSS (Probabilistic Signature Scheme) представляет собой современный механизм цифровой подписи, разработанный как улучшенная альтернатива классической схеме PKCS#1 v1.5. Основная идея заключается в введении вероятностного компонента (salt), который делает подпись менее детерминированной и значительно повышает устойчивость к криптоаналитическим атакам.

Алгоритмы:

  • PS256 — RSA-PSS с хешированием SHA-256
  • PS384 — RSA-PSS с SHA-384
  • PS512 — RSA-PSS с SHA-512

Каждый из них объединяет:

  • RSA как асимметричный алгоритм
  • PSS как схема подписи
  • соответствующую хеш-функцию

Ключевая особенность RSA-PSS — использование salt, длина которого обычно совпадает с длиной выхода хеша.


Поддержка RSA-PSS в Jsrsasign

Библиотека Jsrsasign реализует работу с RSA-PSS через объект:

KJUR.crypto.Signature

и криптографический провайдер:

KEYUTIL

Поддержка PS256, PS384 и PS512 реализуется через параметр alg.


Формирование ключевой пары RSA для PS-алгоритмов

Перед использованием подписей необходимо создать RSA ключ.

Генерация ключа

const kp = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = kp.prvKeyObj;
const publicKey = kp.pubKeyObj;

Размер ключа:

  • минимум 2048 бит для PS256
  • 3072+ рекомендуется для PS384
  • 4096 для PS512 в высокозащищённых системах

Подпись данных с использованием PS256

Базовый пример подписи

const sig = new KJUR.crypto.Signature({
  alg: "SHA256withRSAandMGF1",
  prov: "cryptojs/jsrsa"
});

sig.init(privateKey);
sig.updateString("data to sign");
const signature = sig.sign();

Разбор параметров

  • SHA256withRSAandMGF1 — обозначение RSA-PSS с SHA-256
  • MGF1 (Mask Generation Function) используется внутри PSS
  • salt length автоматически соответствует хешу

Подпись с PS384

const sig = new KJUR.crypto.Signature({
  alg: "SHA384withRSAandMGF1",
  prov: "cryptojs/jsrsa"
});

sig.init(privateKey);
sig.updateString("important payload");
const signature = sig.sign();

Особенности PS384:

  • более длинный хеш (384 бита)
  • повышенная криптостойкость по сравнению с PS256
  • увеличенный размер вычислений

Подпись с PS512

const sig = new KJUR.crypto.Signature({
  alg: "SHA512withRSAandMGF1",
  prov: "cryptojs/jsrsa"
});

sig.init(privateKey);
sig.updateString("critical system data");
const signature = sig.sign();

PS512 применяется в системах:

  • финансового уровня безопасности
  • государственных инфраструктурах
  • долговременного хранения подписей

Проверка подписи RSA-PSS

Общий механизм проверки

const sig = new KJUR.crypto.Signature({
  alg: "SHA256withRSAandMGF1",
  prov: "cryptojs/jsrsa"
});

sig.init(publicKey);
sig.updateString("data to sign");

const isValid = sig.verify(signature);

Проверка включает:

  • восстановление хеша
  • сверку salt
  • сравнение RSA-результата

Использование PS256, PS384, PS512 в JWT (JWS)

Jsrsasign активно применяется для работы с JWT через:

KJUR.jws.JWS

Создание JWT с PS256

const header = {
  alg: "PS256",
  typ: "JWT"
};

const payload = {
  sub: "1234567890",
  name: "Alice",
  admin: true
};

const sHeader = JSON.stringify(header);
const sPayload = JSON.stringify(payload);

const jwt = KJUR.jws.JWS.sign(
  "PS256",
  sHeader,
  sPayload,
  privateKey
);

Проверка JWT с PS256

const result = KJUR.jws.JWS.verifyJWT(jwt, publicKey, {
  alg: ["PS256"]
});

const payloadObj = KJUR.jws.JWS.readSafeJSONString(
  KJUR.jws.JWS.parse(jwt).payloadPP
);

Различия PS256, PS384 и PS512 на уровне безопасности

1. Длина хеша

Алгоритм Хеш
PS256 SHA-256
PS384 SHA-384
PS512 SHA-512

2. Уровень стойкости

  • PS256 — стандартный уровень безопасности (широко используется)
  • PS384 — усиленный уровень
  • PS512 — максимальный уровень среди распространённых RSA-PSS схем

3. Производительность

  • PS256 быстрее
  • PS384 средний баланс
  • PS512 медленнее из-за длины хеша

Важный аспект: saltLength

В RSA-PSS критическим параметром является salt length.

В Jsrsasign он обычно:

  • равен длине хеша
  • устанавливается автоматически

Но при необходимости можно контролировать через расширенные параметры:

const sig = new KJUR.crypto.Signature({
  alg: "SHA256withRSAandMGF1",
  psalg: {
    md: "sha256",
    mgf1md: "sha256",
    saltlen: 32
  }
});

Типичные ошибки при работе с PS-алгоритмами

Несовпадение алгоритма подписи и проверки

Подпись создана PS256, а проверка выполняется как PKCS1 v1.5 — результат всегда false.


Неправильный выбор ключа

RSA ключ менее 2048 бит может:

  • не поддерживаться
  • вызывать ошибки при verify

Несоответствие JWT alg

Если заголовок JWT содержит:

{
  "alg": "PS256"
}

а проверка настроена на RS256 — токен будет отклонён.


Сравнение PS256 и RS256 в Jsrsasign

RS256 (PKCS#1 v1.5)

alg: "SHA256withRSA"

PS256 (RSA-PSS)

alg: "SHA256withRSAandMGF1"

Ключевые различия:

  • RS256 детерминированный
  • PS256 вероятностный
  • PS256 устойчивее к атаке на структуру подписи
  • RS256 более совместим со старыми системами

Практические сценарии использования

API-аутентификация

PS256 применяется для:

  • подписи access token
  • межсервисной аутентификации

Финансовые системы

PS384 и PS512:

  • подпись транзакций
  • защита платёжных сообщений
  • аудит операций

Долговременная валидация данных

PS512 предпочтителен:

  • архивные подписи
  • юридически значимые документы
  • государственные реестры

Работа с PEM-ключами

Загрузка приватного ключа

const privateKey = KEYUTIL.getKey(pemPrivateKey);

Загрузка публичного ключа

const publicKey = KEYUTIL.getKey(pemPublicKey);

Jsrsasign автоматически распознаёт:

  • PKCS#1
  • PKCS#8
  • encrypted PEM

Кодирование результата подписи

Подпись RSA-PSS в Jsrsasign обычно возвращается в:

  • HEX
  • Base64 (через конвертацию)

Base64 пример

const b64sig = hextob64(signature);

Интеграция PS-алгоритмов в архитектуру приложений

Использование PS256/384/512 оправдано в системах, где требуется:

  • защита от подмены структуры подписи
  • высокая криптостойкость на уровне TLS-эквивалента
  • долгий срок жизни ключей

Особенности совместимости

Некоторые внешние системы могут:

  • не поддерживать RSA-PSS
  • требовать RS256

В таких случаях Jsrsasign позволяет переключаться между:

  • "SHA256withRSA"
  • "SHA256withRSAandMGF1"

без изменения логики данных.


Внутреннее устройство RSA-PSS в Jsrsasign

При выполнении подписи происходит:

  1. Хеширование сообщения (SHA-256/384/512)
  2. Генерация salt
  3. Формирование MGF1 маски
  4. Кодирование блока EMSA-PSS
  5. Применение RSA private exponentiation
  6. Получение цифровой подписи

При проверке выполняется обратная процедура с восстановлением структуры EMSA-PSS.


Практика выбора алгоритма

  • PS256 — основной выбор для веб-приложений и JWT
  • PS384 — компромисс для повышенной безопасности
  • PS512 — критические системы и долгосрочные подписи