Classes criptografadas e ClassLoader

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:

  1. 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.

  2. 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.

Olá

Procure por um artigo antigo do javaworld que mostra como e discute as vantagens e desvantagens de criptografar e/ou zipar classes.

[]s
Luca

Porque não, ao invés de criptografar, aplicar um obfuscator como o proguard?

Soa mais sensato, visto que apenas a JVM irá entender aquele bytecode, e decompilador não será um bom meio de fazer engenharia reversa.

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.

Ok. O que acho que pode ser feito? Vejamos…

  • 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.

Olá

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.

Achei uns links que nem examinei:

[]s
Luca

[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:

  1. 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.

  2. 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

Tente usar o http://www.javaworld.com/javaworld/javaqa/2003-05/01-qa-0509-jcrypt.html?page=1

Em produção nunca ninguem, usou algo identico??? acho que vou abrir um topico especifico para isso