A melhor maneira de proteger a API REST privada sem a autenticação do usuário para o aplicativo para dispositivos móveis

Estou fazendo algumas APIs Restful para minha aplicação móvel.

A comunicação entre APP e servidor web deve ser feita em REST. Esses apis devem ser privados, e somente meu aplicativo pode chamá-los para resultados bem-sucedidos.

A parte difícil é, não há identificação de usuário e senha necessárias no meu aplicativo para que eu não saiba como eu poderia restringir a API de descanso com o aplicativo para dispositivos móveis sem a autenticação básica do usuário.

Uma solução que eu pensei era incorporar algum tipo de string de código rígido, então, quando o aplicativo móvel usará a URL restante, eles passarão isso em formato de criptografia sobre o ssl. Mas eu sei que isso parece uma solução muito ruim …

sugerir gentilmente qual deve ser a melhor solução em tal situação.

Dê uma olhada no mecanismo do código de autenticação de mensagem baseado em Hash (HMAC).

Link da Wikipedia: http://en.wikipedia.org/wiki/Hash-based_message_authentication_code

Seu cliente (aplicativo móvel) precisará de uma chave de API pública que identifique o cliente REST webservice e uma chave privada / criptográfica . A chave pública API pode ser enviada junto com a solicitação HTTP. É público e todos podem vê-lo. A chave privada, no entanto, nunca deve ser enviada junto com o pedido, e só deve ser conhecida pelo servidor e pelo cliente. Essa chave é usada para gerar a mensagem hash que em vez disso será enviada para o servidor. O HMAC pode ser gerado usando um algoritmo SHA1 / MD5, uma mensagem que deve ser gerada por um algoritmo que o servidor e o cliente conhecem e, finalmente, a chave privada.

Você está certo, a chave embutida no aplicativo pode ser facilmente recuperada por sniffers de pacotes ou várias outras técnicas. Você pode superar esse problema usando as seguintes instruções.

  • O cliente (seu aplicativo) chamará a API necessária
  • O servidor irá rejeitar, mas em resposta enviará uma string contendo hash random (= desafio ).
  • O cliente usa essa string em combinação com alguma outra string (= senha ) (já incorporada no aplicativo) para gerar um novo hash (= digest )
  • O cliente irá chamar a mesma API novamente, mas desta vez usando o recém-criado digest como parâmetros de autenticação.
  • O servidor validará esse resumo e procederá

FYI: o procedimento acima mencionado é padrão amplamente aceito e sendo referido como autenticação Digest . Se você precisar de mais ajuda, basta perguntar ao Google “autenticação de http de digitação do Android”

Eu sugeriria criar um token complexo no aplicativo, feito do timestamp + appId + qualquer outro valor que você possa replicar no servidor e autenticar no header de cada solicitação usando aqueles.

Por exemplo, você poderia criar um “usuário” virtual no seu db e armazenar nele o dispositivo e usá-lo para o seu algoritmo.

Eu pessoalmente mantenho uma solicitação de API pública, que é o getter do timestamp, que retorna o timestamp do servidor para usar dentro de 300 segundos.

então, antes de cada pedido, obtenha o carimbo de data / hora e envie o token criado, replica-o no servidor e, assim, autentique o pedido.

Um hacker medíocre pode reverter o engenheiro do aplicativo e replicar seus tokens embora