Estou pesquisando alguma maneira de criptografar minhas classes. Já pesquisei exaustivamente, mas ainda não achei uma solução que considerasse adequada. O que parece ser mais efetivo é criptografar as classes, com 3DES por exemplo, e desenvolver um ClassLoader para carregar as classes criptografadas. No entanto, as questões para as quais não encontrei resposta são as seguintes:
Este ClassLoader deve ser utilizado somente para carregar as classes da minha aplicação (as que estão no classpath). Extensões e classes padrão da JVM (rt.jar, i18n.jar) devem ser carregadas pelo ClassLoader padrão.
Questão principal: Como resolver o problema da criptografia do próprio ClassLoader? De nada adiantaria utilizar uma criptografia forte nas classes da aplicação, pois decompilando o ClassLoader qualquer um poderia facilmente decriptografar as demais classes. Será que desenvolver um programa em C e através de JNI carregar o próprio ClassLoader, que neste caso está criptografado, é uma solução, senão a única?
Agradeço desde já aos interessandos em trocar idéias a respeito destas questões.
De acordo Aldrin, utilizar o obfuscator é mais prático, mesmo que ainda não seja atingido um excelente nível de segurança contra engenharia reversa, é opção rápida e viável.
Na verdade trata-se de um trabalho academico, por isso a criptografia, mas que ainda assim poderia ser utilizado no “mundo real”, no caso de realmente ter de garantir o código contra engenharia reversa.
Protocolos Criptográficos fortes (Bruce Scheneier, sem dúvida)
Hardware de Proteção (USB Dongles e Java Card me vem à mente)
Criptografia da Classe utilizando Security Tokens.
Este me soa o mais interessante, pelo seguinte motivo:
Como, em tese, um Smart Card irá centralizar a lógica de um determinado método necessário para a criptografia, você estará pesando toda a segurança nele. Ocorre que Smart Cards são dispositivos aonde a capacidade de acessar os códigos nele é restrita.
Você só faz upload do código e a partir daí, você comunica usando protocolos baseados em pacote. Alguns que me vem a mente são o TripleSec e o HausKeys, do safehaus.org.
S/KEY e outros protocolos de One-Time-Password também me soam interessantes, mas com a contrapartida de limitar o número de execuções possíveis.
Fui googlar e não achei o artigo que procurava. Mas tenho a certeza de que existe e eu já usei. Ele criptografa os arquivos .class e carrega com um classloader customizado. Mas enquanto as classes estão na memória elas estão abertas.
[quote=DMurr]Estou pesquisando alguma maneira de criptografar minhas classes. Já pesquisei exaustivamente, mas ainda não achei uma solução que considerasse adequada. O que parece ser mais efetivo é criptografar as classes, com 3DES por exemplo, e desenvolver um ClassLoader para carregar as classes criptografadas. No entanto, as questões para as quais não encontrei resposta são as seguintes:
Este ClassLoader deve ser utilizado somente para carregar as classes da minha aplicação (as que estão no classpath). Extensões e classes padrão da JVM (rt.jar, i18n.jar) devem ser carregadas pelo ClassLoader padrão.
Questão principal: Como resolver o problema da criptografia do próprio ClassLoader? De nada adiantaria utilizar uma criptografia forte nas classes da aplicação, pois decompilando o ClassLoader qualquer um poderia facilmente decriptografar as demais classes. Será que desenvolver um programa em C e através de JNI carregar o próprio ClassLoader, que neste caso está criptografado, é uma solução, senão a única?
Agradeço desde já aos interessandos em trocar idéias a respeito destas questões.[/quote]
conta ai para mim que solução encontraste, estou precisando de algo identico