RSASSA-PKCS1-v1_5 относится к семейству RSA-алгоритмов цифровой подписи, основанных на схеме заполнения PKCS
RSA-подпись в этой схеме строится на асимметричной криптографии: есть пара ключей — приватный и публичный. Приватный ключ используется для формирования подписи, а публичный — для её проверки.
Схема RSASSA-PKCS1-v1_5 работает следующим образом:
Ключевая особенность этой схемы заключается в том, что она детерминированная: одинаковые входные данные всегда дают одинаковую подпись при одном и том же ключе.
В Web Crypto API алгоритм обозначается строкой:
RSASSA-PKCS1-v1_5
Он используется в трёх основных операциях:
Поддержка зависит от браузера, но в современных реализациях (Chrome, Firefox, Safari, Edge) алгоритм доступен стабильно.
Для начала работы требуется создать ключевую пару:
const keyPair = await crypto.subtle.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
true,
["sign", "verify"]
);
modulusLength
publicExponent
[1, 0, 1])hash
SHA-256, также возможны
SHA-384, SHA-512Подпись создаётся с использованием приватного ключа:
const encoder = new TextEncoder();
const data = encoder.encode("сообщение для подписи");
const signature = await crypto.subtle.sign(
{
name: "RSASSA-PKCS1-v1_5"
},
keyPair.privateKey,
data
);
Результат signature представляет собой
ArrayBuffer, содержащий бинарную подпись.
Особенности:
Проверка выполняется с использованием публичного ключа:
const isValid = await crypto.subtle.verify(
{
name: "RSASSA-PKCS1-v1_5"
},
keyPair.publicKey,
signature,
data
);
Результат:
true — подпись корректнаfalse — данные или подпись изменены, либо ключ не
соответствуетСхема PKCS#1 v1.5 является одной из старейших схем заполнения для RSA. Её структура фиксирована и включает:
0x00 0x010xFF0x00Примерно:
00 01 FF FF FF ... 00 ASN.1 DigestInfo
Несмотря на широкое использование, схема считается менее устойчивой к некоторым классам атак по сравнению с RSA-PSS.
В Web Crypto API существует более современный вариант:
RSA-PSSКлючевые различия:
RSASSA-PKCS1-v1_5
RSA-PSS
Web Crypto позволяет экспортировать ключи для хранения или передачи:
const exportedPublicKey = await crypto.subtle.exportKey(
"spki",
keyPair.publicKey
);
const exportedPrivateKey = await crypto.subtle.exportKey(
"pkcs8",
keyPair.privateKey
);
Полученные данные — бинарные ArrayBuffer, обычно
кодируются в Base64 для хранения.
const publicKey = await crypto.subtle.importKey(
"spki",
exportedPublicKey,
{
name: "RSASSA-PKCS1-v1_5",
hash: "SHA-256"
},
true,
["verify"]
);
const privateKey = await crypto.subtle.importKey(
"pkcs8",
exportedPrivateKey,
{
name: "RSASSA-PKCS1-v1_5",
hash: "SHA-256"
},
true,
["sign"]
);
Web Crypto API работает с бинарными структурами
(ArrayBuffer), поэтому в реальных приложениях часто
требуется кодирование:
function bufferToBase64(buffer) {
const bytes = new Uint8Array(buffer);
let binary = "";
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
function base64ToBuffer(base64) {
const binary = atob(base64);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
return bytes.buffer;
}
Алгоритм широко используется в инфраструктуре, где важна совместимость:
В JSON Web Token алгоритм обозначается как:
RS256
Это означает:
Структура подписи JWT:
header.payload.signature
где signature создаётся RSA-операцией над хэшем первых
двух частей.
Несмотря на распространённость, схема имеет особенности, которые важно учитывать:
Отсутствие случайности Подпись полностью детерминирована, что упрощает некоторые атаки при ошибочной реализации протоколов.
Зависимость от правильной валидации Ошибки в проверке ASN.1 структуры могут привести к уязвимостям.
Исторические атаки на PKCS#1 v1.5 Существуют атаки на неправильно реализованные проверки подписи (например, Bleichenbacher-подобные сценарии), особенно в старых системах.
При использовании Web Crypto API важно учитывать:
Promiseextractable: falsecrypto.webcryptoRSASSA-PKCS1-v1_5 имеет следующие характеристики:
На практике узким местом чаще является именно генерация ключей, а не операция подписи.
Несовпадение hash-алгоритма Ключ создаётся с одним hash, а подпись выполняется с другим — приводит к невалидным результатам.
Передача строки вместо ArrayBuffer Web Crypto не принимает строки напрямую.
Повторное использование ключей с разными алгоритмами Ключ, созданный для RSASSA-PKCS1-v1_5, нельзя использовать в RSA-PSS.
Игнорирование кодировок Разные стороны системы могут использовать различное преобразование строки в байты.
Алгоритм закреплён в:
Он остаётся актуальным из-за огромного количества существующих систем, где замена алгоритма невозможна без миграции инфраструктуры.