В спецификации JSON Web Key (JWK) симметричные ключи представляются
типом kty: "oct", где ключ хранится как последовательность
байтов в виде строки, закодированной в base64url. Основное поле для
такого ключа — k, содержащее секретный материал.
{
"kty": "oct",
"k": "base64url-encoded-secret"
}
Для симметричных алгоритмов используется один и тот же секрет для шифрования и расшифрования или подписи и проверки. В JWK это отражается минимальным набором обязательных полей:
kty: всегда "oct" для симметричных
ключейk: секретный ключ в формате base64urlalg (опционально): предполагаемый алгоритм
использования ключаkey_ops (опционально): допустимые операции (например
["encrypt", "decrypt"])ext: признак извлекаемости ключаk:
представление секретного ключаПоле k содержит не строку в привычном смысле, а бинарные
данные, закодированные в base64url без padding.
+ и / заменяются на -
и _=Пример:
{
"kty": "oct",
"k": "GawgguFyGrWKav7AX4VKUg"
}
В библиотеке Jsrsasign симметрические ключи можно генерировать через
криптографические утилиты KJUR.crypto.
Пример генерации случайного ключа:
const keyObj = new KJUR.crypto.KeyObject();
const rawKey = KEYUTIL.getKey("AES", 256); // создание 256-битного ключа
const jwk = KEYUTIL.getJWKFromKey(rawKey);
В результате получается объект JWK:
{
"kty": "oct",
"k": "base64url-encoded-key",
"alg": "A256GCM"
}
Симметричный ключ может быть создан вручную при условии корректного base64url кодирования.
const raw = "supersecretkeymaterial";
const b64 = Buffer.from(raw).toString("base64")
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=+$/, "");
const jwk = {
kty: "oct",
k: b64
};
Jsrsasign поддерживает работу с симметричными ключами через
унифицированный API KEYUTIL.
const key = KEYUTIL.getKey(jwk);
После преобразования ключ может использоваться в криптографических операциях.
k ключаОдно из основных применений симметричных JWK — HMAC-подписи.
const hmac = new KJUR.crypto.Mac({ alg: "HmacSHA256", pass: key });
hmac.updateString("message data");
const signature = hmac.doFinal();
Здесь ключ, извлечённый из k, используется как секрет
для HMAC.
Для алгоритмов шифрования, таких как AES, ключ из JWK применяется напрямую.
const cipher = new KJUR.crypto.Cipher({
alg: "AES",
key: key
});
const encrypted = cipher.encrypt("plaintext message");
const decrypted = cipher.decrypt(encrypted);
kПри работе с симметричными JWK необходимо учитывать строгие требования:
Несоответствие длины приводит к ошибкам криптографических операций.
Частая ошибка — использование обычного base64:
=+ и /Поле alg должно согласовываться с размером ключа:
A128GCMA256GCMHS256, HS512 для HMACJsrsasign предоставляет унифицированный механизм:
const keyObj = KEYUTIL.getKey(jwk);
Внутренне происходит:
kПри экспорте ключа:
const jwkOut = KEYUTIL.getJWKFromKey(keyObj);
Результат включает:
kty: "oct"k — base64url строкаkey_opsПоле key_ops ограничивает допустимые операции:
{
"kty": "oct",
"k": "base64urlkey",
"key_ops": ["encrypt", "decrypt"]
}
Возможные операции:
encryptdecryptsignverifyХотя для симметричных ключей чаще используется HMAC и AES, ограничения операций помогают контролировать контекст использования.
Использование поля k связано с прямым хранением
секретного материала, что требует строгого контроля:
JWK с k нельзя размещать в публичных репозиториях без
защиты.
Использование предсказуемых строк снижает криптографическую стойкость.
Один и тот же k не должен использоваться для разных
алгоритмов (например, AES и HMAC одновременно).
const rawKey = KJUR.crypto.Util.getRandomHexOfNbytes(32);
const b64 = hextob64u(rawKey);
const jwk = {
kty: "oct",
k: b64,
alg: "A256GCM"
};
const key = KEYUTIL.getKey(jwk);
const cipher = new KJUR.crypto.Cipher({
alg: "AES",
key: key
});
const encrypted = cipher.encrypt("data");
const exported = KEYUTIL.getJWKFromKey(key);
Симметричные JWK тесно связаны с:
Поле k является фундаментом для:
kПриводит к невозможности декодирования ключа.
Особенно критично для AES.
Некорректная обработка строки k при JSON.stringify может
нарушить формат.
В Jsrsasign работа с k происходит через единый слой
абстракции:
KEYUTIL — преобразование ключейKJUR.crypto.Mac — HMAC операцииKJUR.crypto.Cipher — симметричное шифрованиеБиблиотека автоматически определяет:
oct)После декодирования k превращается в:
Uint8Array-подобная структура)Этот слой никогда не должен быть сериализован обратно без необходимости.
kk в архитектуре безопасностиСимметричные JWK применяются в:
Ключевой аспект — единый секретный источник, представленный в
стандартизированном JSON формате через k.