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.

Uma caixa de chaves em um mercado de pulgas em Nova York.

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.

cripto

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.

encriptação-simétrica-1

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"AlgoritmoTamanho da Chave
HS256HMAC com SHA-25664 bytes
HS384HMAC com SHA-384128 bytes
HS512HMAC com SHA-512128 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.

encriptação-assimétrica-1

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

clippy_octocat

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.

Referências