O que é um JSON Web Key (JWK)?
Um JSON Web Key (JWK) é um formato baseado em JSON usado para representar chaves criptográficas. É amplamente utilizado no contexto de Assinatura da Web JSON (JWS) e Criptografia da Web JSON (JWE) para validar a integridade e confidencialidade de JSON Web Tokens . Também é usado em OpenID Connect (OIDC) para gerenciamento de identidade e acesso.
Por exemplo, uma chave pública ECDSA codificada em PEM:
-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEF/xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4
f1Qx3y49cUm646fMBX9DYx+43HzXm6VdX77uFymz90aO4dBunpTdUzLFRAiT7+In
gzZGDrIE+FG6CcqQuRP65r65SUzDOmP5
-----END PUBLIC KEY-----
…pode ser representada como um JWK:
{
"kty": "EC",
"crv": "P-384",
"x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
"y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
}
Como funciona um JWK?
Como o JWK é um formato baseado em JSON, ele pode transportar metadados ricos sobre a chave em comparação com formatos tradicionais como PEM. Aqui estão alguns atributos comuns em um JWK:
kty
(Key Type): A família de algoritmos criptográficos usada com a chave. Valores comuns incluemRSA
,EC
eoct
.EC
foi marcado como “Recomendado+” no RFC 7518 .use
(Public Key Use): O uso pretendido da chave pública. Valores comuns incluemsig
(assinatura) eenc
(criptografia).key_ops
(Key Operations): As operações de chave suportadas pela chave. Valores comuns incluemsign
,verify
,encrypt
edecrypt
.alg
(Algorithm): O algoritmo pretendido para uso com a chave. Dependendo do tipo de chave, o algoritmo pode variar. Por exemplo,RS256
pode ser usado com uma chave RSA, enquantoES256
pode ser usado com uma chave EC.kid
(Key ID): Um identificador único para a chave. Pode ser usado para corresponder a uma chave específica em um conjunto de chaves.
Exceto kty
, todos os outros atributos são opcionais e podem ser usados para fornecer contexto adicional sobre a chave. De acordo com o valor de kty
, outros atributos podem ser obrigatórios ou opcionais. No exemplo acima, o JWK representa uma chave ECDSA (kty: "EC"
) com uma curva de P-384 (crv: "P-384"
). Os atributos x
e y
contêm as coordenadas da chave pública.
Aqui está outro exemplo não normativo de um JWK de chave pública RSA:
{
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
"e": "AQAB",
"kid": "2011-04-29-1234"
}
Para informações detalhadas sobre os atributos do JWK e seus significados, consulte o RFC 7517 .
JSON Web Key Set (JWKS)
Quando múltiplos JWKs precisam ser agrupados, eles são organizados em um JSON Web Key Set (JWKS). Um JWKS é um objeto JSON que contém um array de JWKs. É comumente usado na resposta do endpoint jwks_uri
em Descoberta do OpenID Connect (OIDC) para fornecer as chaves públicas para validação de Chave de assinatura de JWT.
Aqui está um exemplo não normativo de um JWKS contendo dois JWKs:
{
"keys": [
{
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
"e": "AQAB",
"kid": "2011-04-29-1234"
},
{
"kty": "EC",
"crv": "P-384",
"x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
"y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
}
]
}
Neste exemplo, o JWKS contém dois JWKs: uma chave RSA e uma chave EC. O atributo keys
é um array de JWKs, cada um representando uma chave diferente.