[quote=andredf]Prezados,
Pesquisando na internet sobre como tratar de segurança em código java, encontrei o seguinte link ftp://ftp.registro.br/pub/gts/gts0204/gts0204-01slides-seg-prog-java.pdf
Um dos assuntos que tenho muito interesse no que se refere às vulnerabilidades do java é sobre a exposição dos bytecodes. Como soluções para isso, o artigo cita o seguinte:
- Adição de código não funcional ao código fonte.
- Ofuscação do código fonte.
- riptografia dos arquivos compilados (.class).
- Esconder os arquivos compilados (.class).
Quanto ao item 2 (ofuscação), conheço o programa proguard que realiza essa tarefa.
E quanto aos demais itens? Algúem conhece, pode dar uma ajuda de como fazer?
O que seria um código não funcional e como adicioná-lo ao código fonte? Algum exemplo?
Como criptografar e esconder os arquivos compilados?
Há algum material (talvez um livro) que trate desses assuntos?
[/quote]
Existe um livro bom sobre isto chamado Covert Java.
Agora, tem coisas e tem coisas.
As pessoas normalmente esquecem que o que elas vendem não é software, são as licenças de uso.
Quem vende o software de fato , vc vendo o codigo e os direitos.
A licença é uma forma de transferir direitos. Especialmente o direito de uso.
No antigamente os programas vinha com mecanismos chamados de “licença”. Isto é a representação eletrónica da licença legal que o usuário adquiriu.
A licença também é onde se estipula o que não se pode fazer e um dos exemplos dos programas clássicos semrpe foi “Vc não pode decompilar este codigo”.
Portanto, a forma correta, real, que funciona, para proteger o codigo é a lei. Qualquer um que copie, decompile, etc. o codigo estará violando a lei e portanto vc pode processá-lo por isso. Não é uma questão de proibir que ele viole, é saber quando foi violado.
Por outro lado, segurança é tudo sobre o prémio. Quando o prémio é grande o suficiente o adversário tentará o acesso ilegitimo. Portanto, o sistema de segurança tem que tornar o acesso mais caro que o prémio. Tão simples assim. Ele não precisa garantir que não haverá violação, apenas que o advesário pagará por ela, mais que o prémio.
Portanto, ofuscar o código e depois encriptá-lo é uma opção melhor que não fazer nada. A classe que desencripta é aberta (não encriptada) mas não faz mal. Afinal o algoritmo de desincritação já é publico. Basta então que o classloader necessite de um arquivo com a chave correta. Essa chave é uma forma de licença. A chave em si pode ser submetida a um processo de legitimação que garante que apenas aquele usuário tem a licença certa. Isto é possivel mas complexo. Uma forma é fazer o software se auto autenticar (como o windows faz) de forma que não haja intervenção humana. Contudo, algum informação do cliente será necessária.
Um algortimo de chave privada-publica é obviamente mandatório isto porque mesmo que o cara desencript a coisa não consigue encriptar de volta.
Mas a segurança é mais do isto. Se for possivel, começar com nem sequer dar acesso ao código. hoje em dia o SaaS é famoso porque permite exactamene isto (entre outras coisas).
O ponto é :difculte se quiser, mas é tudo uma questão de prémio. Se vc tivesse um software que descobre os numeros de mega-sena com certeza o cara não vai parar até crackar , mas ninguém vai crackar a serie de fiboncci ou um gerador aletório. Talvez vc pense que o seu software é a oitava maravilha e ninguém mais pense isso.
Veja que mesmo um codigo C é crackavel - antigamente os caras crackavam todos os jogos. O que a industria fez ? jogos online onde sequer vc sabe onde fica o executável. Isto para dizer que não a plataforma ou a linguagem que são vulneráveis, é a arquitetura e o design.