Nosso produto registra novos players em nosso serviço e optamos por hospedá-lo no Azure (estamos usando .NET) e queríamos que fosse sem estado (para escalabilidade) e relativamente seguro.
Como este é o primeiro WS REST que estou escrevendo, eu gostaria de obter algum feedback sobre se é ou não uma solução sólida.
Algumas presunções para saber sobre o nosso aplicativo:
- Os usuários estão logados no serviço anonimamente, sem exigir uma senha de um usuário
- O WS deve ser completamente sem estado para permitir o dimensionamento horizontal
- Estamos nos conectando usando HTTPS (SSL) para impedir a invasão de terceiros
EDITAR:
- Temos como alvo dispositivos iOS / Android nativos
- Nossa principal preocupação é garantir que apenas clientes não violados possam enviar solicitações
E o processo de autenticação abstrata:
- O cliente cria um hash simples (UDID: Timestamp) e o criptografa usando o timestamp com algum algoritmo básico (por exemplo, chave secreta é todo segundo caractere do hash)
- O cliente envia seu UDID, carimbo de data e hora e hash para o servidor
- O servidor reconstrói o hash e descriptografa o hash criptografado enviado pelo usuário
- Se os dois forem iguais - sabemos que ele foi realmente enviado de nosso cliente (e, esperançosamente, não de um remetente malicioso)
Qualquer entrada / sugestão seria ótima - obviamente, já que é a primeira vez que estou lidando com esse problema, talvez eu o tenha projetado incorretamente.
Obrigado!
2ª atualização:
Lendo as especificações de segurança do OAuth, parece que não há resposta real para minha pergunta - já que o cliente e o servidor precisam conhecer as chaves secretas e o cliente é armazenado localmente nos dispositivos móveis de nossos usuários (em oposição a um aplicativo Web).
No guia de segurança do OAuth ( http://hueniverse.com/oauth/guide/security/ ):
Ao implementar o OAuth, é fundamental entender as limitações de segredos compartilhados, simétricos ou assimétricos. O segredo do cliente (ou chave privada) é usado para verificar a identidade do cliente pelo servidor. No caso de um cliente baseado na Web, como um servidor Web, é relativamente fácil manter o segredo do cliente (ou chave privada) em sigilo.
No entanto, quando o cliente é um aplicativo de desktop, um aplicativo móvel ou qualquer outro software do lado do cliente, como applets de navegador (Flash, Java, Silverlight) e scripts (JavaScript), as credenciais do cliente devem ser incluídas em cada cópia do aplicativo . Isso significa que o segredo do cliente (ou chave privada) deve ser distribuído com o aplicativo, o que herda de comprometimento.
Isso não impede o uso do OAuth dentro desse aplicativo, mas limita a quantidade de confiança que o servidor pode ter em tais segredos públicos. Como os segredos não podem ser confiáveis, o servidor deve tratar esse aplicativo como entidades desconhecidas e usar a identidade do cliente apenas para atividades que não exijam nenhum nível de confiança, como coleta de estatísticas sobre aplicativos. Alguns servidores podem optar por proibir esse aplicativo ou oferecer diferentes protocolos ou extensões. No entanto, neste momento, não há solução conhecida para essa limitação.
Respostas:
Isso é um pouco fora da tangente, mas, do ponto de vista da segurança, qualquer segredo que esteja em um cliente não é um segredo. Você declara na sua pergunta isso.
Como alguém que trabalhou na indústria de jogos, essa é uma causa perdida. Se houver valor suficiente para poder enviar solicitações arbitrárias, os usuários descobrirão como enviar essas solicitações. Você nunca pode confiar em saber se uma solicitação é de um cliente confiável. Aqui estão algumas dicas das minhas experiências.
fonte
A chave sobre o REST é que você está usando os recursos inerentes em http:
Outra orientação é que seus URLs devem ser intuitivos, ou seja, se o seu URL para jogadores for
http://example.com/api/player
uma maneira sensata de expor seu último histórico de pontuaçõeshttp://example.com/api/player/1/scores
(por exemplo, as pontuações para o ID do jogador 1).Quanto à segurança, o que você leu nas especificações do OAuth é muito verdadeiro ... se você estiver incorporando algum tipo de chave privada em um binário em que outras pessoas possam ter as mãos, você não pode assumir que seja totalmente privado. Sugiro que, se você tiver algum tipo de chave privada em seu código, configure-a para que possa expirar e, em seguida, envie uma atualização para alterá-la. De qualquer modo, aproveite a oportunidade para protegê-lo com criptografia e todo o resto, mas facilite a desativação se for invadido. A realidade é que o twitter e outros sofrem esse mesmo desafio, onde de vez em quando as chaves secretas de seus aplicativos oficiais são descobertas e publicadas na internet, e eles precisam atualizar seus aplicativos.
fonte