Алгоритмы
Каждый алгоритм, поддерживаемый Flytachi JWT, материал ключа, который каждый из них ожидает, и то, как на них отображаются типы ключей JWK. Это авторитетный список — другие страницы ссылаются сюда.
Поддерживаемые алгоритмы
Девять алгоритмов в трёх семействах. Значение в заголовке alg должно быть одним из
них, иначе encode()/decode() выбрасывает «Algorithm ‘…’ is not supported.»
alg |
Семейство | Механизм | Хеш | Материал ключа |
|---|---|---|---|---|
HS256 |
HMAC | hash_hmac |
SHA-256 | строка общего секрета |
HS384 |
HMAC | hash_hmac |
SHA-384 | строка общего секрета |
HS512 |
HMAC | hash_hmac |
SHA-512 | строка общего секрета |
RS256 |
RSA | openssl_sign |
SHA-256 | пара ключей RSA |
RS384 |
RSA | openssl_sign |
SHA-384 | пара ключей RSA |
RS512 |
RSA | openssl_sign |
SHA-512 | пара ключей RSA |
ES256 |
ECDSA | openssl_sign |
SHA-256 | пара ключей EC (P-256) |
ES384 |
ECDSA | openssl_sign |
SHA-384 | пара ключей EC (P-384) |
ES512 |
ECDSA | openssl_sign |
SHA-512 | пара ключей EC (P-521) |
Симметричные против асимметричных
HMAC (HS*) |
RSA / ECDSA (RS* / ES*) |
|
|---|---|---|
| Ключ подписи | общий секрет | приватный ключ |
| Ключ проверки | тот же общий секрет | публичный ключ |
| Выбор ключа при decode | по kid, иначе единственный переданный |
то же самое |
нужен kid |
когда ключей несколько | когда ключей несколько |
| Кто может подделать | любой, у кого есть секрет | только держатель приватного ключа |
Алгоритм привязан к ключу
И PrivateKey, и PublicKey несут свой алгоритм. При decode алгоритм ключа проверки
должен совпадать с alg из заголовка токена — несовпадение отвергается до
проверки. См. Модель безопасности.
Формат подписи ECDSA
Стоит знать, если сверяете токены побайтово или отлаживаете совместимость: ES* несут
подпись сырой парой чисел R || S, каждое дополнено нулями слева до ширины кривой
(RFC 7515 §3.4). Никакой ASN.1 обёртки в токене нет, хотя openssl_sign() возвращает
именно её.
alg |
Кривая | Длина подписи |
|---|---|---|
ES256 |
P-256 | 64 байта (32 + 32) |
ES384 |
P-384 | 96 байт (48 + 48) |
ES512 |
P-521 | 132 байта (66 + 66) |
Библиотека конвертирует в обе стороны сама. Признак неверной реализации — подпись,
начинающаяся с байта 0x30: это DER-структура, попавшая в токен как есть, и принять её
не сможет ни один сторонний верификатор.
Типы ключей JWK
Парсер JWK принимает три стандартных значения kty и отображает их на семейства
выше:
kty |
Обязательные поля JWK | Проверяет | Поле кривой |
|---|---|---|---|
RSA |
n, e, alg |
RS* |
— |
EC |
crv, x, y, alg |
ES* |
crv (ниже) |
oct |
k, alg |
HS* |
— |
Соответствие кривых EC
JWK crv |
Алгоритм | Размер координаты |
|---|---|---|
P-256 |
ES256 |
32 байта |
P-384 |
ES384 |
48 байт |
P-521 |
ES512 |
66 байт |
Любая другая кривая выбрасывает «Unsupported EC curve». См. Проверка через JWKS для разбора наборов ключей.
Генерация ключей по семействам
# HMAC — случайный общий секрет
openssl rand -base64 32
# RSA — пара ключей на 2048 бит
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
# ECDSA (ES256) — пара ключей P-256
openssl ecparam -name prime256v1 -genkey -noout -out ec-private.pem
openssl ec -in ec-private.pem -pubout -out ec-public.pemДля ES384 используйте -name secp384r1; для ES512 используйте -name secp521r1.
Связанное
- Асимметричные ключи — RSA и ECDSA от начала до конца
- HMAC-токены — подпись общим секретом
- Модель безопасности — почему привязка алгоритма важна