Segurança de aplicações Java (Evitar replicações)

Olá colegas,

Tenho uma aplicação que precisa ter alguns recursos de segurança extras. É o seguinte, a aplicação não pode ser replicada, ou seja, de alguma forma preciso dificultar a replicação do software, que deve funcionar após uma ativação.

Esta aplicação, no caso é para celulares, utilizando J2ME, porém, estou colocando neste fórum pois não se trata de algo muito ligado ao J2ME.

O caso é o seguinte, o usuário no caso instala o software no aparelho, e digita um serial único para ativar o binário junto ao um servidor de ativação. A grande questão, que esta abordagem ainda gera umas dúvidas em relação à segurança. A idéia geral é que cada binário tenha um serial, gerado e colocado direto no seu código fonte. A pergunta, nesta abordagem é a seguinte, existe a possibilidade, e qual a dificuldade dela, de algum usuário mal intencionado que conheça bem java consiga pegar o software, extrair o serial, instalar em outro aparelho e ativá-lo? Ou seja, crackear mesmo.

Eu, se fosse mal intencionado, utilizada um Java Decompiler. (Mesmo o programa ter sido “obfuscado” pelo Proguard, daria para retirar a string do serial, certo?).

Alguem, vendo este caso, acha que apesar desta abordagem ser insegura, é viável? Alguem tem outras alternativas? Colocar um humano no processo de ativação poderia ajudar a tentar detectar fraudes?

No meu cenário, eu tenho um servidor que será o servidor de ativação para ajudar, só será ativado perante uma consulta. E no caso do J2ME, não posso pegar nem o IMEI, nem o ID do SIMCard para diferenciar aparelhos, imagine um cenário com o mínimo de informação possível.

O meu problema é que NÃO pode ter replicações. Não se trata de um Jogo ou coisa qualquer que algumas replicações causem apenas um pequeno prejuízo.

1 - Distribua binários únicos apenas aos usuários que ligarem para se cadastrar, contendo algum tipo de identificação.

2 - Com isto, todos os usuários que utilizarem o sistema serão identificados

3 - Mantenha no servidor algum algoritmo de bloqueio, pois se algum usuário conectar 2x será bloqueado.

4 - Mantenha algum bloqueio a nível de aplicação, a aplicação deve verificar se o software já foi registrado no servidor antes de ser utilizada inicialmente.

Qualquer outra forma de segurança vai ser quebrada facilmente.

[]'s

[quote=aleck]1 - Distribua binários únicos apenas aos usuários que ligarem para se cadastrar, contendo algum tipo de identificação.
[/quote]

É exatamente o caso que tentei explicar, os usuários serão identificados, o problema é alguém replicar e utilizar o sistema como se fosse este mesmo usuário em benefício próprio, prejudicando o usuário real, dando um prejuízo financeiro ao usuário real (meu problema causa isto…).

Sim, serão identificados, mas cai no mesmo problema. Sabemos que serão identificados, mas isso não quer dizer que é a mesma pessoa.

É sim, isso é verdade, só pode ser ativado uma vez. O problema é o cara replicar o software já ativado, ou seja, o software não conseguir identificar se esta sendo executado pela primeira vez, já que o “cracker” pode replicar a base de dados junto. Com o J2ME não tenho um “registro” que fica no sistema operacional ou algo mais que me ajude. Imagine um cenário bem desfavorável.

Copiar o RMS do aparelho para outro é algo muito dificil, porém possível. O cracker terá que conhecer muito bem o sistema de arquivos de ambos aparelhos e como tudo funciona. É algo muito dificil, mas não improvável.
Se fosse improvável, eu não teria problemas, nem teria utilizado este fórum para levantar questões de segurança. =)

aleck, Muito obrigado, você levantou questões muitos importantes, vai me ajudar a pensar em vários recursos de segurança. Estou testando a possibilidade de utilizar criptografia simétrica em algum lugar. Isto já será utilizado na comunicação entre o servidor e o cliente.

A utilização do software é o seguinte, não expliquei no inicio no post, uma vez ativado, o usuário utilizará o programa em que as ações serão feitas conectadas em um servidor, ocorrendo uma troca de dados. Ou seja, nao é um jogo que você ativa e utiliza off-line. O sistema é todo online.

O binário será assinado digitalmente, mas isto não resolve meu problema.

Tem, o J2ME, pacotes opcionais que me ajudariam muito, mas neste caso, o software só pode utilizar as bibliotecas ‘standard’, MIDP e CLDC, nada mais.

A possibilidade de criptografia é algo que pode realmente dificultar, porém não impede alguém realmente interessado em quebrar o sistema.

Recomendo que o usuário seja informado de cada transação que ele mesmo fizer via SMS, instruindo o mesmo a entrar em contato caso ele não tenha feito.

Com isto vocês tem como cancelar a operação ou algo do gênero sem causar prejuizo ao usuário.

Uma coisa que aprendi é que não podemos confiar apenas nos sistemas para garantir a segurança, os processos devem andar em paralelo.

[]'s

Olá amigos … sou novo nisso e gostaria de saber se a a assinatura digital dos jar’s com uma quantidade de dias ajuda a proteger minha aplicação após o limite de uso dias … e se funciona certin … tipo … o cara pode atrazar a data do pc e não vai adianta nada quando o certificado expirar … falo isso pois ja ouvi essa possibilidade …