Quando escolhemos usar JWT em nossas APIs e nos apps front-end tipo SPA, é importante decidir qual algoritmo usar para gerar um token. Temos opções entre algoritmos que usam uma chave ou duas, e isso pode ser feito de maneira previsível ou com variação. Aqui, vamos dar dicas práticas e explicar como assinar seus JWTs do jeito certo.
Para gerar um JWT, você precisa escolher um método de criptografia. Veja um exemplo prático:
Além de RSA, podemos usar chaves simples ou ECDSA.
Escolher o algoritmo certo é importante porque cada um funciona de um jeito específico.
Algoritmo
Um algoritmo de criptografia é como uma fórmula que transforma dados normais em algo cifrado. Para voltar ao original, você precisa de uma chave.
JWT com chave única
Nos algoritmos que usam uma chave, a mesma chave serve para codificar e decodificar. Então, todos precisam ter essa chave.
HMAC
Os HMACs usam uma chave e a segurança depende da função hash usada (ex: SHA256).
Quando usar chave única?
Só use se tiver uma API. Se outras APIs precisarem validar tokens, compartilhar a chave pode ser arriscado e levar a acesso indevido.
Criando uma chave HMAC
Antes de criar a chave, pense em quantos serviços vão gerar JWTs depois. O tamanho da chave é importante, de acordo com o NIST:
"alg" | Algoritmo | Tamanho da Chave |
---|---|---|
HS256 | HMAC com SHA-256 | 64 bytes |
HS384 | HMAC com SHA-384 | 128 bytes |
HS512 | HMAC com SHA-512 | 128 bytes |
Veja como criar a chave automaticamente no .NET:
Este exemplo cria uma nova chave cada vez que a app reinicia, o que invalida tokens antigos. Para evitar isso, use JsonWebKey para guardar e recuperar chaves:
JWT com chaves duplas
Chaves duplas usam um par: uma chave privada para assinar e uma pública para checar.
RSA
O RSA usa chaves duplas e mudou a criptografia digital. A chave privada assina e a pública verifica.
Curvas Elípticas - ECDSA
ECC é vista como mais segura e eficiente que o RSA, sendo muito recomendada.
Quando usar chaves duplas?
Preferencialmente sempre, especialmente em ambientes com várias APIs ou OAuth 2.0, onde é um requisito obrigatório.
Criando RSASSA-PSS com SHA-256 e MGF1 com SHA-256
Exemplo de código:
Exemplo para salvar e recarregar a chave:
Criando ECDSA com P-256 e SHA-256
Persistência manual por causa de um bug conhecido:
Eu recomendo o componente Jwks.Manager para ajudar a gerenciar e proteger as chaves.
Componente Jwks.Manager
Eu recomendo o componente Jwks.Manager para ajudar a gerenciar e proteger as chaves.
Download

Baixe o projeto completo no meu GitHub
Conclusão
JWT e OAuth 2.0 podem parecer complicados, mas várias práticas e ferramentas podem simplificar. Espero que este artigo ajude a melhorar a segurança das suas APIs.