Segurança da API REST: HMAC / hash de chave vs JWT


16

Acabei de ler este artigo, que tem alguns anos, mas descreve uma maneira inteligente de proteger suas APIs REST. Essencialmente:

  • Cada cliente possui um par de chaves pública / privada exclusivo
  • Somente o cliente e o servidor conhecem a chave privada; nunca é enviado por fio
  • Com cada solicitação, o cliente obtém várias entradas (a solicitação inteira em si, o registro de data e hora atual e a chave privada) e as executa através de uma função HMAC para produzir um hash da solicitação
  • O cliente envia a solicitação normal (que contém a chave pública) e o hash para o servidor
  • O servidor procura a chave privada do cliente (com base na chave pública fornecida) e faz alguma verificação de carimbo de data / hora (que reconhecidamente não entendo) para verificar se a solicitação não é vítima de um ataque de repetição
  • Se tudo estiver bem, o servidor utilizará a chave privada e a mesma função HMAC para gerar seu próprio hash da solicitação
  • O servidor compara os dois hashes (o enviado pelo cliente e o gerado); se corresponderem, a solicitação será autenticada e permitida a continuação

Tropecei no JWT , o que parece muito semelhante. No entanto, o primeiro artigo não menciona o JWT e, portanto, estou me perguntando se o JWT é diferente da solução de autenticação acima e, em caso afirmativo, como.


1
Lol ... Eu só queria fazer a mesma pergunta exata e me deparei com a sua. Uma das primeiras coisas que descobri sobre autenticação sem estado foi na AWS: docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/… e implementou algo como este massimilianosciacco.com/… . Então eu encontrei o JWS / JWT e é de alguma forma semelhante. Mas, pelo que entendi, o JWT é um padrão e as outras soluções descritas acima são algumas implementações personalizadas (não padronizadas). Alguém me corrija se eu estiver errado.
Nyxz 16/09/2015

2
É bom saber que não sou a única preocupada com esses tipos de detalhes! O JWT certamente parece semelhante, e o bônus é que ele é padronizado. Só estou me perguntando como funciona (em termos de segurança) com esta solução HMAC personalizada.
smeeb 16/09/15

Respostas:


7

Vamos começar com uma resposta muito básica.

O JWT (conforme usado no contexto do OAuth e OpenID) não requer segredos compartilhados entre o cliente e a API. Existem 3 componentes e pares de 2 compartilham um segredo cada: cliente <-> servidor de identificação, servidor de identificação <-> API.

Isso move a maior complexidade da API para o servidor de identificação, a API apenas precisa verificar se o token foi emitido pelo servidor de identificação e não foi temperado. Para verificar se a API verifica se a assinatura JWT é válida com o único segredo compartilhado conhecido entre o servidor de identificação e a API. É isso aí!

Como o servidor de identificação valida a identidade do usuário pode variar bastante (em muitos casos, é o antigo par de nome de usuário e senha em uma conexão TLS), mas não tem efeito na sua API.

Privacidade e segurança da mensagem e do próprio token ao usar o JWT são tratados pelo TLS, o JWT ignora esses problemas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.