RSA-PSS (Probabilistic Signature Scheme) представляет собой современный механизм цифровой подписи, разработанный как улучшенная альтернатива классической схеме PKCS#1 v1.5. Основная идея заключается в введении вероятностного компонента (salt), который делает подпись менее детерминированной и значительно повышает устойчивость к криптоаналитическим атакам.
Алгоритмы:
Каждый из них объединяет:
Ключевая особенность RSA-PSS — использование salt, длина которого обычно совпадает с длиной выхода хеша.
Библиотека Jsrsasign реализует работу с RSA-PSS через объект:
KJUR.crypto.Signature
и криптографический провайдер:
KEYUTIL
Поддержка PS256, PS384 и PS512 реализуется через параметр
alg.
Перед использованием подписей необходимо создать RSA ключ.
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = kp.prvKeyObj;
const publicKey = kp.pubKeyObj;
Размер ключа:
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-256const sig = new KJUR.crypto.Signature({
alg: "SHA384withRSAandMGF1",
prov: "cryptojs/jsrsa"
});
sig.init(privateKey);
sig.updateString("important payload");
const signature = sig.sign();
Особенности PS384:
const sig = new KJUR.crypto.Signature({
alg: "SHA512withRSAandMGF1",
prov: "cryptojs/jsrsa"
});
sig.init(privateKey);
sig.updateString("critical system data");
const signature = sig.sign();
PS512 применяется в системах:
const sig = new KJUR.crypto.Signature({
alg: "SHA256withRSAandMGF1",
prov: "cryptojs/jsrsa"
});
sig.init(publicKey);
sig.updateString("data to sign");
const isValid = sig.verify(signature);
Проверка включает:
Jsrsasign активно применяется для работы с JWT через:
KJUR.jws.JWS
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
);
const result = KJUR.jws.JWS.verifyJWT(jwt, publicKey, {
alg: ["PS256"]
});
const payloadObj = KJUR.jws.JWS.readSafeJSONString(
KJUR.jws.JWS.parse(jwt).payloadPP
);
| Алгоритм | Хеш |
|---|---|
| PS256 | SHA-256 |
| PS384 | SHA-384 |
| PS512 | SHA-512 |
В RSA-PSS критическим параметром является salt length.
В Jsrsasign он обычно:
Но при необходимости можно контролировать через расширенные параметры:
const sig = new KJUR.crypto.Signature({
alg: "SHA256withRSAandMGF1",
psalg: {
md: "sha256",
mgf1md: "sha256",
saltlen: 32
}
});
Подпись создана PS256, а проверка выполняется как PKCS1 v1.5 — результат всегда false.
RSA ключ менее 2048 бит может:
Если заголовок JWT содержит:
{
"alg": "PS256"
}
а проверка настроена на RS256 — токен будет отклонён.
alg: "SHA256withRSA"
alg: "SHA256withRSAandMGF1"
Ключевые различия:
PS256 применяется для:
PS384 и PS512:
PS512 предпочтителен:
const privateKey = KEYUTIL.getKey(pemPrivateKey);
const publicKey = KEYUTIL.getKey(pemPublicKey);
Jsrsasign автоматически распознаёт:
Подпись RSA-PSS в Jsrsasign обычно возвращается в:
const b64sig = hextob64(signature);
Использование PS256/384/512 оправдано в системах, где требуется:
Некоторые внешние системы могут:
В таких случаях Jsrsasign позволяет переключаться между:
"SHA256withRSA""SHA256withRSAandMGF1"без изменения логики данных.
При выполнении подписи происходит:
При проверке выполняется обратная процедура с восстановлением структуры EMSA-PSS.