Sistema anti-cópia para aplicativos em stick USB
Autor: Marcos Barbosa | Publicado: 2009-11-23T16:08:00-08:00

Esta não é uma idéia completamente nova e nem completamente minha. Uma versão dela é usada pelo aplicativo MacLockPick, mas estou descrevendo o que penso ser o esquema de funcionamento.Vamos ao funcionamento: O segredo está em ligar o número de série do dispositivo de armazenamento ao aplicativo em questão. Sendo assim se mudar o número de série (o que acontece no caso de uma cópia não autorizada para outro stick USB) o aplicativo não funcionará. Ok, aí está a idéia básica: Ligar o aplicativo ao número de série do stick USB.Mas ocorre um problema: Deve-se incluir o número de série e recompilar o programa para ele se "encaixar" em cada stick USB. Imagine: Pegar o número de série do stick USB, inserir o número de série no programa, compilar o programa, gravar no stick USB. E se mudar de stick USB (para uma maior, por exemplo) precisa baixar todo um novo programa.Vamos a solução do problema: Associar o número de série a um arquivo e este arquivo com o programa, assim basta reescrever o arquivo e o programa se mantém inalterado. O processo de criação do arquivo pode ser feito por um outro programa que pega o número de série, gera o arquivo e grava no stick USB.Ótimo! Já foi explicado o segundo ponto: Associar o número de série com um arquivo e o arquivo com o programa.Agora uma questão: Qual deve ser o conteúdo do arquivo? Resposta: Algo diretamente relacionado ao número de série e que possa ser verificado pelo programa (para garantir que o programa está no stick USB que deveria estar). A primeira coisa que se pensa (e está perfeitamente correto) é gravar no arquivo o número de série do stick USB. Dessa forma fica fácil: O programa compara o número de série do stick USB com o número armazenado no arquivo. Se bater o programa roda. Se não dá um erro e termina.Mas gravar apenas o número é uma proteção fraca, já que basta copiar para outro stick USB e colocar no arquivo o  número de série correspondente. Então se pensa em algum jeito de proteger o número de série para impossibiltar sua modificação. Neste caso temos três métodos:a) Utilizar um algortimo de hash (MD5, SHA-1 ou proprietário). Assim o que o programa deve fazer é aplicar o hash em cima do número de série e comparar com o conteúdo do arquivo. Porém se for usado um algortimo conhecido fica fácil burlar este sistema e mesmo que seja um algoritmo totalmente novo o código dele deverá estar presente na aplicação, o que, através de engenharia reversa, pode permitir que seja descoberto e o sistema de proteção quebrado.b) Utilizar criptografia simétrica: Boa opção, já que mesmo que o algoritmo seja conhecido ainda é necessário saber a chave. Porém vai exigir que a chave esteja presente no código do programa, o que causa a mesma fraqueza do item A.c) Utilizar criptografia assimétrica: Esta é a solução que considero a ideal. Ela é ideal por que permite utilizar um algoritmo conhecido, já que conta com a proteção das chaves. Mas não tem a desvantagem do item B, já que as chaves são completamente diferentes então é perfeitamente seguro incluir uma das chaves no código.Então a solução final (e perfeita, ao meu ver) é simples: Crie um pequeno programa que criptografe o número de série com uma chave privada e grave o arquivo no stick USB. Inclua no programa um trecho de código que descriptografe com a chave pública o conteúdo do arquivo e compare o número de série obtido com o número de série do stick USB onde o programa está gravado. Pronto! O sistema anti-cópia perfeito!Dúvidas, comentários e sugestões serão bem-vindos. Lembrando que esta idéia esta licenciada sob Creative Commons Atribuição-Compartilhamento, sendo assim você só possui duas restrições: Citar o autor original e, em caso de modificação, compartilhar sobre a mesma licença. Have fun :)Update: Detectei uma falha no sistema anti-cópia com criptografia assimétrica que quero comentar. A falha é a seguinte: Um hacker pode alterar a chave pública presente na aplicação, assinando o número de série do stick USB com uma chave privada própria e que terá sua chave pública correspondente inserida na aplicação.