Pergunta

Estou procurando maneiras seguras de passar dados entre um cliente executando Flash e um servidor.Os dados em questão serão gerados PELO aplicativo Flash, que neste caso é a sua pontuação após terminar um jogo.Quero verificar se os dados estão intactos no servidor.Quais são alguns bons métodos para fazer isso?

Uma maneira simples é realizar algumas operações nos dados, como um hash, e passar o hash de volta ao servidor junto com os dados.No entanto, isso é facilmente quebrado por alguém com acesso ao código-fonte do cliente.

Editar:Sei que nada será impossível de hackear, mas quero tornar isso o mais difícil possível.A solução de @jcnnghm de criptografar dados com uma chave pública e, opcionalmente, fazer verificações de integridade e/ou recálculo com os logs do jogo é a melhor opção, eu acho.A criptografia SSL também é uma boa ideia, pois torna mais difícil decifrar o que realmente está sendo enviado de volta ao servidor.

Foi útil?

Solução

Criptografe os dados com uma chave pública armazenada no binário.Isso aumentará a barreira de entrada para um ataque.Além disso, a sanidade verifica os dados à medida que chegam ao servidor.Isso pode ser tão simples quanto calcular o número máximo de pontos que podem ser ganhos de forma realista por unidade de tempo de jogo ou transmitir os registros do jogo de volta ao servidor para garantir que a pontuação esteja correta.

Nada será totalmente à prova de hackers, não importa o que você faça, mas isso impedirá todos, exceto os mais determinados.

Atualizar: @marca:Flash oferece suporte nativo a SSL.

Outras dicas

O código executado em uma plataforma não confiável pode manter sua integridade?Não, décadas de esquemas de proteção contra cópia quebrados levam-me a postular que isso é impossível.O código malicioso inverso executado em uma sandbox confiável é viável, mas o melhor que você pode fazer com o seu problema é torná-lo inconveniente para as pessoas trapacearem.

Confira o pacote AS3Crypto em http://code.google.com/p/as3crypto/.Ainda não experimentei, mas este pacote afirma oferecer suporte (parcialmente) ao protocolo TLS 1.0.

O TLS fornecerá um túnel seguro entre seu aplicativo Flash e o servidor.http://en.wikipedia.org/wiki/Secure_Sockets_Layer

@jcnnghm Você normalmente não deseja usar a criptografia pública (RSA, DSA) para a criptografia de dados a granel devido ao seu grande tempo computacional.A criptografia de chave pública deve ser usada nas fases de handshake e acordo de chave em um protocolo de segurança, mas a criptografia de dados em massa deve ser tratada por uma cifra simétrica como AES e TDES.Os protocolos TLS e SSL funcionam desta forma.

Contanto que as pessoas consigam acessar o executável - o que, a menos que você queira rodar o jogo em um quiosque bloqueado, é sempre o caso - não há uma maneira perfeitamente segura de fazer isso.

As indústrias de música e cinema gastaram dezenas de milhões em DRM que foi quebrado por amadores domésticos em dias/semanas.Se eles não podem proteger deles coisa...

Concordo que as respostas dadas sobre nada são à prova de hackers.Porque uma vez que você possa lê-lo, você pode manipulá-lo/copiá-lo e descompilá-lo.

Outra abordagem que estou planejando é gerar chaves exclusivas pr.sessão do jogador (incluindo algum tipo de hora/data como valores salt).

Em seguida, durante todo o aplicativo, talvez enviando/transmitindo periodicamente a pontuação de status e obtendo uma nova chave válida.Se esta sincronização falhar, interrompa toda a sessão.

A desvantagem disso pode ser o fato de muitos jogadores simultâneos reduzirem a velocidade de resposta do servidor e, portanto, fazerem "falsos tempos limite" + deixar o servidor de jogo aberto para ataques DoS.

Mas algo como renovar a "chave de sessão" enquanto o usuário tiver a sessão exigirá um pouco de gerenciamento extra de sessão, mas se isso fizer com que os trapaceiros trabalhem um pouco mais, com certeza tentarei: o)

Por outro lado, NADA é à prova de hackers, então não confie 100% - não importa quão inteligente seja a solução que você inventar.

Uma última observação também seria dividir sua aplicação em módulos/níveis, etc.para que você não tenha acesso a todas as partes do código, apenas iniciando-o.

Atualmente meu plano é construir um grande mundo multinível e o cliente/jogador SÓ receberá os arquivos anexados à parte em que o jogador reside.

Espero que isso seja útil para seus pensamentos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top