Visão geral dos algoritmos de assinatura JWT
Explore os algoritmos de assinatura de JSON Web Token (JWT), abordando duas das abordagens mais populares de criptografia assimétrica: RSA e EC. Aprenda sobre as vantagens e desvantagens de cada algoritmo e como o Logto os utiliza para proteger seus tokens JWT.
O que é um JWT?
JSON Web Token (JWT) é uma maneira compacta e segura baseada em URL para representar reivindicações. A estrutura inclui um cabeçalho, carga útil e assinatura.
Hoje em dia, os JWTs foram amplamente adotados e desempenham um papel crucial no OAuth 2.0 e OIDC. Mas como um servidor de autorização verifica e confia em um JWT enviado de um cliente? Como o token é emitido e assinado pelo emissor? Neste post, falaremos sobre criptografia assimétrica e aprofundaremos os prós e contras de diferentes algoritmos de assinatura que o Logto usa em seus tokens JWT.
Estrutura JWT
O Logto assina todos os tokens JWT, incluindo tokens de ID e tokens de acesso. Um JWT assinado também é conhecido como JWS (JSON Web Signature). Uma estrutura de JWT assinada consiste em três partes: o cabeçalho, a carga útil e a assinatura, separados por pontos (.
).
Cabeçalho JOSE (JSON Object Signing and Encryption)
O cabeçalho geralmente consiste nas seguintes partes:
- typ: O tipo de token, que é o JWT.
- alg: O algoritmo de assinatura sendo usado, como RS256 ou ES384.
- kid: Uma dica indicando qual chave foi usada para proteger o JWT.
Carga útil
A carga útil contém as reivindicações, que são declarações sobre uma entidade (tipicamente, o usuário) e dados adicionais. Por exemplo, um token de ID pode conter as seguintes reivindicações:
Assinatura
A assinatura é usada para verificar que o remetente do JWT não é um impostor e que a mensagem não foi adulterada. Ao usar um JWT assinado, é necessário verificar a assinatura do token para garantir a integridade do token. Confira este guia sobre como validar tokens JWT para proteger sua API.
O que é criptografia assimétrica?
A criptografia assimétrica, também conhecida como criptografia de chave pública, um conceito fundamental em segurança computacional e criptografia, envolve o uso de um par único de chaves relacionadas: uma chave pública e uma chave privada.
Definições de chaves públicas e privadas
- Chave pública: A chave pública, como o nome sugere, é projetada para compartilhamento aberto. No contexto de JWT e sistemas semelhantes, a chave pública é usada para verificação de assinatura, não criptografia. Quando os dados são assinados com a chave privada e o destinatário possui a chave pública correspondente, ele pode validar que os dados foram de fato assinados pelo detentor da chave privada e não foram adulterados durante a transmissão.
- Chave privada: Em contraste, a chave privada é um segredo profundamente guardado que deve ser conhecido apenas por seu proprietário legítimo. No contexto de JWT, a chave privada é usada para criar assinaturas digitais que podem ser verificadas por qualquer pessoa com acesso à chave pública correspondente.
Esse arranjo único de chaves forma a base da transmissão segura de dados e dos mecanismos de autenticação de usuários no mundo digital. Confira este post para mais detalhes.
Algoritmos de chave de assinatura JWT populares: RSA vs EC
Os algoritmos RSA (Rivest-Shamir-Adelman) e EC (Elliptic Curve) são as duas “funções matemáticas” mais comumente usadas em criptografia assimétrica.
Como desenvolvedores, frequentemente temos uma escolha entre esses algoritmos ao lidar com uma estrutura de autenticação e seus JWTs. Mas qual seria a sua escolha? Vamos nos aprofundar nos prós e contras de cada um.
Algoritmo de assinatura RSA (por exemplo, RSASHA256)
- Prós:
- Suporte amplo: o RSA é amplamente suportado em várias plataformas e bibliotecas, garantindo compatibilidade em uma ampla gama de ambientes.
- Histórico longo: o RSA tem um longo histórico de segurança confiável, e seus algoritmos são bem compreendidos pela comunidade criptográfica.
- Contras:
- Tamanhos de chave: as chaves RSA são mais longas para alcançar o mesmo nível de segurança que EC, resultando em tamanhos de token maiores e aumento da sobrecarga computacional.
- Desempenho: as operações RSA tendem a ser mais lentas do que EC, o que pode ser uma desvantagem em aplicativos de alto tráfego.
Algoritmo de assinatura EC (por exemplo, ECDSASHA384)
- Prós:
- Eficiência: a EC possui um desempenho superior em comparação com o RSA, tornando-a ideal para aplicativos com restrições de recursos ou cargas de tráfego altas.
- Tamanhos de chave compactos: as chaves EC são muito mais curtas do que suas contrapartes RSA, oferecendo níveis de segurança equivalentes. Isso leva a requisitos reduzidos de armazenamento e rede e operações criptográficas aceleradas.
- Segurança: a EC é altamente valorizada por sua segurança robusta, fortalecida pelos complexos matemáticos por trás das curvas elípticas, tornando-a resistente a ataques de força bruta.
- Contras:
- Suporte limitado: alguns sistemas e bibliotecas mais antigas podem não oferecer suporte abrangente a EC, potencialmente causando problemas de compatibilidade. Por exemplo, Cloudflare Zero Trust não suporta tokens assinados por EC.
- Complexidade: implementar EC pode ser mais intrincado devido às complexidades matemáticas envolvidas.
Escolha do Logto de algoritmos de assinatura JWT
O Logto sempre esteve comprometido com os mais altos padrões de segurança e flexibilidade e tende a usar as soluções mais modernas e eficientes em seu núcleo. A EC oferece uma combinação vencedora de segurança robusta e eficiência computacional, tornando-a um ajuste ideal para as necessidades modernas de autenticação e autorização. Portanto, a EC tem sido nosso algoritmo padrão de chave de assinatura desde o estágio inicial de nosso produto.
No entanto, também reconhecemos que os tokens assinados por EC não são compatíveis com alguns sistemas e frameworks de terceiros, especialmente os legados. Assim, também introduzimos um recurso para alterar seu algoritmo de chave de assinatura JWT rotacionando suas chaves privadas.
Portanto, se você estiver enfrentando o problema de não conseguir se conectar a uma plataforma de terceiros devido ao algoritmo de assinatura JWT não suportado, agora é o momento de rotacionar e selecionar o algoritmo RSA para sua nova chave privada.
Este recurso também ajuda a mitigar os riscos associados à exposição ou comprometimento de chaves a longo prazo. Realizar a rotação regular de chaves privadas deve ser uma prática fundamental na estratégia de segurança de qualquer organização e é altamente recomendada pelo Logto.
Recapitulação: os algoritmos de assinatura JWT mais comumente usados: RSA e EC
Assinar tokens JWT garante a integridade e autenticidade dos dados transmitidos. A escolha do algoritmo de assinatura pode ter um impacto significativo na segurança, desempenho e compatibilidade do seu aplicativo.
Ambos os algoritmos RSA e EC são essenciais e populares na criptografia. Compreender os prós e contras e os princípios matemáticos por trás desses algoritmos ajuda a tomar melhores decisões para que seu aplicativo funcione com um framework de autenticação e autorização.
O Logto continuará explorando e oferecendo uma experiência de usuário mais segura e robusta.