Estamos trabalhando em um novo projeto, somos dois desenvolvedores líderes e entramos em uma encruzilhada sobre como usar um token para proteger a comunicação entre o servidor e o cliente.
Primeira sugestão: (o token estático do AKA)
o cliente solicita um token primário, enviando o nome de usuário e a senha e o current_time (essa variável será salva no banco de dados do servidor e também no lado do cliente) para a API, o servidor interpreta a entrada e renderiza um token (por exemplo: 58f52c075aca5d3e07869598c4d66648) o salva no banco de dados e o retorna ao cliente.
Agora, o cliente salva o token primário e cria um novo token de hash usando o token primário + a variável current_time enviada na solicitação de autenticação (vamos chamar esse novo token, main_token) também o servidor faz o mesmo e cria o mesmo token usando o mesmo algoritmo .
Sempre que o cliente consulta a API do servidor, ele envia o main_token para o servidor, agora o servidor compara o token gerado nele com o main_token enviado pelo cliente, se corresponder, significa que o usuário é real
Segunda sugestão: (token dinâmico)
O cliente gera duas chaves aleatórias ($ key1 = rand (10000,90000); $ key2 = rand (10000,90000);) Em cada solicitação na API, o cliente cria um hash usando o tipo de consulta e as duas chaves com um algoritmo complexo e envia essas duas chaves + o hash para o servidor
O servidor, usando o mesmo algoritmo usado no cliente, cria um hash e compara com o enviado pelo cliente; se corresponder, o servidor continuará a lidar com a consulta
Agora, a pergunta é: qual é a maneira mais lógica e segura de usar para proteger as solicitações de API?
Respostas:
Eu realmente gosto da primeira abordagem em geral.
Uma coisa que não vi mencionada sobre a primeira que você deve ter em mente: o carimbo de data / hora usado para hash do token precisa ter uma validade TTL extremamente curta (como 1 segundo) para verificar se a mensagem não foi enviada com o mesmo timestamp e token de uma mensagem 12 horas antes; obviamente, seria calculado como legítimo, mas não é neste caso.
Se essas são as duas únicas opções que você está considerando, eu gostaria de ter certeza de que também analisou outras abordagens, pois há muitas. Mais do que eu vou listar de fato. Essas são algumas abordagens de autenticação comuns que valem a pena ser estudadas apenas para verificar se elas se encaixam melhor no seu objetivo e se nada mais as compreende, podem lhe dar algumas idéias para ajudar a reforçar a abordagem que você usar.
Observe que eu não sou especialista em segurança.
OAuth / Federado
Nessa abordagem, você tem um garantidor de terceiros, onde o código de consumo solicita o token / cert / o que você possui e o passa para você. Nesse momento, tudo o que você precisa fazer é perguntar à terceira parte se a chave que você recebeu foi legítimo.
Pró:
Vigarista:
Certificados assíncronos
Aqui, seus clientes criptografarão suas comunicações com um certificado público que você compartilhou com eles quando criaram um usuário. Do seu lado, você descriptografaria usando a chave privada associada ao usuário. Geralmente, você iniciaria a comunicação com uma resposta de desafio para mostrar que eles podem criptografar / descriptografar conforme o esperado, identificando-os como eles afirmam ser. Embora sejam possíveis abordagens "síncronas" que não usem a resposta de desafio, elas têm um pouco menos de segurança e alguns problemas de sincronização de tempo, o que pode torná-las mais complicadas.
da Novell (sim, eu sei, romance? Sério?)
Pró:
Vigarista:
NTLM
Não ria, se este é um serviço menor ou interno e você está em um ambiente Windows, não há nada de errado em usar a autenticação NTLM padrão para garantir o acesso. Especialmente se você estiver trabalhando com o IIS, essa é a abordagem mais simples. Fácil de manter e configurar também em um web.config.
Pró:
Vigarista:
Nonces
Ao trabalhar com nonces em sua abordagem de autenticação, você fornece um método para obter um nonce no serviço. Esse método retorna uma sequência ou parte de dados arbitrária exclusiva ("a nonce") em cada solicitação. Agora, toda solicitação para outros métodos exige que um nonce seja recuperado e usado no algoritmo de criptografia para a solicitação. O valor aqui é que o servidor controla os nonces usados e nunca permite a reutilização de um nonce; isso evita completamente os ataques de repetição porque, uma vez que uma solicitação com um nonce é feita, uma solicitação com esse nonce nunca pode ser feita novamente. Conforme os nonces são solicitados, eles são adicionados a uma lista de nonces disponíveis, à medida que são usados, são movidos da lista disponível para a lista usada.
Pró:
Vigarista:
fonte