Uma forma de esconder o código

29 respostas
furutani

Olá
Eu preciso fazer uma classe que gera uma senha de liberação dos nossos sistemas, só que, é muito fácil descompilar um .class mesmo usando os obfuscators dá pra ter uma idéia de como é a implementação.
Eu disse pro pessoal que a pasta WEB-INF é protegida e ninguém pode acessa-lá normalmente… mas e se alguém crackear???
O pessoal aqui é muito receioso, principalmente porque eles vem do delphi que gera executaveis que quase não são descompilavéis.

Alguma sugestão? :smiley:

Grato

29 Respostas

I

Vocês estão usando MySQL connector?
Se tiverem, saiba que ele é GPL e tudo o que tem ele como conector deve ser também.
Mas para proteger de tudo isso acho meia falta de necessidade, o que tem d+ no .class? senha do banco de dados? caminho do banco?

furutani

Igor_Barros:
Vocês estão usando MySQL connector?
Se tiverem, saiba que ele é GPL e tudo o que tem ele como conector deve ser também.
Mas para proteger de tudo isso acho meia falta de necessidade, o que tem d+ no .class? senha do banco de dados? caminho do banco?

Não se trata de licença de uso. É que nesse .class irá ter uma implementação de um gerador de senha pra liberação de nossos sistemas, essa implementação deve ser muito bem protegida.

smota

Hummm … gerador de Senha? Senha que vai ser dada pro usuário? Pronto, não precisa proteger a geração da senha mais :wink:

De qualquer modo o WEB-INF é o lugar pra vc colocar … se entrarem no seu servidor nao precisam do gerador de senha, pegam os dados do sistema de uma vez.

furutani

smota:
Hummm … gerador de Senha? Senha que vai ser dada pro usuário? Pronto, não precisa proteger a geração da senha mais :wink:

De qualquer modo o WEB-INF é o lugar pra vc colocar … se entrarem no seu servidor nao precisam do gerador de senha, pegam os dados do sistema de uma vez.


Não vou mais chamar a senha de senha vou chama-lá de código de liberação (isso deve ta gerando confusão)
Esse código de liberação serve para liberar o uso de um sistema, para evitar pirataria e pra não deixar o cliente usar o sistema depois de expirado o contrato.
Se caso o cliente renovar o contrato ele entraria no site geraria um código de liberação, então esse algoritmo que gera esse código deve estar super protegido.
Eu por mim colocava no WEB-INF e ta tudo certo, mas… o chefe é muito desconfiado, já que ele sabe que pode descompilar um .class.
Pra evitar que mesmo o cara invada o servidor esse algoritmo esteja protegido. Entenderam o dilema?

Grato

I

Porque não desenvolver então no super, ultra, hiper, mega, master, super Delphi e criar uma ponte entre a aplicação e a web? Assim você terá seu gerador de senhas super protegido e seu site também, mas vale lembrar uma coisa que o CV me disse hoje de manhã.

“Se você esta preocupado com privacidade, porque você está usando windows? Aliás se você estiver muito preocupado, porque está na internet?” by CV

danieldestro

Pq não usa chaves de criptografia?

smota

Não existe fórmula mágica pra isso … o negócio é você ter um bom contrato e bons clientes.

Em algum ponto sua aplicação terá que acessar essa algoritmo, se for web o único jeito será tendo algo no classpath (que está no WEB-INF) e então vc entra no dilema de novo. Se não for web piora pq vc tem que mandar isso pro cliente.

Pelo que entendi a aplicação é desktop certo?

A aplicação terá que entender a formação desse código pra poder validá-lo, certo? Outro furo, o cara pode descompilar o código da aplicação e fazer engenharia reversa … pior, pode usar AOP para alterar o bytecode e burlar a validação … ehehehe :twisted:

furutani

É sim, mas é em delphi :smiley:

smota:

A aplicação terá que entender a formação desse código pra poder validá-lo, certo? Outro furo, o cara pode descompilar o código da aplicação e fazer engenharia reversa … pior, pode usar AOP para alterar o bytecode e burlar a validação … ehehehe :twisted:

Como sistema é em delphi a possibilidade de fazer engenharia reversa é pequena (pelo menos é o que os delphianos dizem) :roll:

furutani

Olá
O jeito vai ser fazer um programinha em C com esse algoritmo e gerar uma biblioteca so.
Alguém ai tem um tutorial de como fazer isso em linux? é do mesmo jeito que seria feito com dll?

_fs

Cara … qualquer coisa que está conectada na internet não está 100% segura. Entenda e aceite isso.

Sobre ofuscadores, tem esse mais famozinho, sob a LGPL:
http://www.retrologic.com/retroguard-main.html

T

Aham, vou puxar a brasa para a minha sardinha (trabalho direto com isso, portanto não sou tão leigo assim).
No Java 5 existe um novo provider JCE (PKCS#11 Provider), na verdade a Sun comprou esse provider do pessoal da IAIK.
Esse provider possibilita a você usar hardwares criptográficos, como smartcards e USB tokens.
Por exemplo, você pode ir até o site da Certisign e olhar o preço de um conjunto smartcard (CPF eletrônico) mais um leitor de smartcards, só para você ter uma idéia de quanto isso custa. (Testei esse cartão com o Java 5.0 e sei que funciona. O problema é que o cartão da Certisign é “bloqueado” e não aceita você gerar mais chaves que não sejam o certificado digital; então é necessário obter um cartão de teste com o pessoal da GD Burti, que é o fabricante desses cartões. )
Outros caras que fabricam essas coisas são a Rainbow (eles têm um representante no Brasil, e vendem USB Tokens, que são muito parecidos com aqueles “dongles” que se usam para proteger softwares, ou aqueles USB Drives, mas na verdade sao um conjunto smartcard + leitor em um pacote só.)
O acesso ao smartcard é feito via senha, normalmente; para obter os dados secretos, é necessário digitar a senha e ter o cartão.
Não sei se isso é razoável para o seu problema.
Eu acho que o da GD Burti funciona em Linux; já não sei o da Rainbow, mas provavelmente deve funcionar também.

furutani

Lipe, se dependesse de mim eu colocaria de uma vez por todas no WEB-INF.
Mas chefe é chefe… :mrgreen:

Dessa maneira pode não 100% seguro mas ta mais dificil de ser descompilado. :smiley:

Rafael_Steil

Entao faz autenticacao remota. Ou seja, vcs colocam um servidor de autenticacao e as aplicacoes conectam nele para validar os dados.
Mas sempre havera meios de quebrar. Alguem pode simplesmente crackear a aplicacao para dar um bypass no sistema de validacao. Isso acontece com qualquer software, e se o sucesso da emprsa depender exclusivamente disso, eh melhor mudar de ramo :mrgreen:

Rafael

smota

Eu não me especializei em sacanagem, mas Delphi gera código nativo, assim como C, Pascal e um monte de outras coisas … e desde sempre existem cracks pra tudo quanto é programa e até onde eu sei o crack é feito analisando os bytes do coitado do programa e burlando a parte de seguranca do infeliz, ou seja, continua sendo perfeitamente possível cracker seu super/ultra/mega seguro programa powered by Delphi.

então essa papo de seguro em Java menos seguro que em Delphi é furada, os problemas são os mesmos só burlados com uma arquitetura complexa como os smart cards e tokens (burlados pq isso não resolve, sempre haverá um jeito, só é preciso um pouco de motivação pra se descobrir :roll: )

_fs

Que tal gerar os códigos de acesso usando um punhado de dados de 20 lados e mandar o officeboy dizer o código pro cara que comprou o software? Não esqueça da equipe de seguranças e do rastrador no pescoço do coitado do menino. :mrgreen:

furutani

HUHAUahuHAuhuaH
E vamos alugar um carro-forte pro officeboy levar o código.
AHauahuhu

R

Ola!

Estou lendo esse topico e confesso que me perdi no meio de tantas possibilidades. No final das contas fiquei sem saber qual cerne do problema.
Mas se voce deseja uma sistema o mais seguro possivel, poderia pensar em algum tipo de autenticação biometrica. Dá um pouco de trabalho, pois os dados de verificação de biometria devem ser enviando criptografados entre client e server, mas se voce quer garantir que a pessoa é a pessoa mesmo, essa é a melhor opção.
Em relação ao WEB-INF, um servidor Unix, com um bom firewall e um switch L3 ( nem precisa ser router) já são suficientes para garantir a segurança do app server. O que pode ser feito a mais que isso, são regras de rede aplicadas diretamente no kernel do SO.

Lembre-se que as impossibilidades tecnoligicas podem quase sempre ser resolvidas definindo-se procedimentos de utilização do sistema e de sua manutenção.

Espero ter ajudado.

– Ricardo.

furutani

rborges:
Ola!

Estou lendo esse topico e confesso que me perdi no meio de tantas possibilidades. No final das contas fiquei sem saber qual cerne do problema.
Mas se voce deseja uma sistema o mais seguro possivel, poderia pensar em algum tipo de autenticação biometrica. Dá um pouco de trabalho, pois os dados de verificação de biometria devem ser enviando criptografados entre client e server, mas se voce quer garantir que a pessoa é a pessoa mesmo, essa é a melhor opção.
Em relação ao WEB-INF, um servidor Unix, com um bom firewall e um switch L3 ( nem precisa ser router) já são suficientes para garantir a segurança do app server. O que pode ser feito a mais que isso, são regras de rede aplicadas diretamente no kernel do SO.

Lembre-se que as impossibilidades tecnoligicas podem quase sempre ser resolvidas definindo-se procedimentos de utilização do sistema e de sua manutenção.

Espero ter ajudado.

– Ricardo.


Olá Ricardo, obrigado pela sua resposta.
O problema é o seguinte, a gente tem softwares desenvolvidos em delphi que são liberados/bloqueados através de um código. Esse código será oferecido via web, mas o meu chefe sabe que o .class é facilmente descompilado, no caso de uma invasão no servidor de hospedagem o cracker pode pegar a classe e descompilar e ver o algoritmo que gera o codigo.
O que eu como programador quero fazer, é arrumar um jeito de proteger esse algoritmo ao máximo.
Um jeito que achei foi escrever um programa em C e criar um .so.

danieldestro

Amigo, se alguém invadir o seu servidor, seu WEB-INF e roubar o seu .class, pode ter certeza que ele já terá roubado muito mais.

furutani

Com certeza, mas o medo do meu chefe é alguém pegar esse algoritmo e sair vendendo códigos de liberação. Vai dar um trabalho convencer ele. :roll:

PS: Daniel vc escreveu uma matéria pra JM sobre thinlet? To lendo agora.

danieldestro

Foi sim! :oops:
Mas já saiu? eu nem tava sabendo. Hehehehehehe.

Rafael_Steil

furutani:

O que eu como programador quero fazer, é arrumar um jeito de proteger esse algoritmo ao máximo.
Um jeito que achei foi escrever um programa em C e criar um .so.
`

Nem precisa ser .so… um cgi ja da conta do recado. Ai vc usa a minha incrivel http://libcgi.sf.net pra ficar profissa mesmo :mrgreen:

Rafael

R

É Furutani , tem varias maneiras de se fazer isso … Pelo que vejo o problema maior é convencer o chefe. Faça a melhor analise custo beneficio das opções e exponha a ele. A solução que ele aceitar vc implementa. Essas questões burocraticas sao chatas mesmo.

Outra coisa que eu pensei foi fazer uma interface JNI e chamar um binario mesmo. Ai, vc teria o seu algoritimo protegido. O binario pode ser em C mesmo. Ou entao Faz com Process.exec mesmo. Nem precisa ser tao sofisticado.

[ ]'s

– Ricardo.

Diogenes

IMHO, se o problema está centralizado em se obter acesso ao servidor entao uma boa opção é o que o Rafael citou, criação dessa chave de acesso remotamente…

E se achar q é pouco taca isso numa .so e acessa remotamente…

renatosilva

Sugestão: use certificados digitais em vez de códigos secretos.

Diogenes

Mas pq o uso de certificados digitais faria diferença no caso de uma invasão ao servidor?

danieldestro

Você pode encriptar essas chaves, por exemplo. Então, a posse dos algorítmos por sí só não seriam suficientes.

renatosilva

Diogenes:
Mas pq o uso de certificados digitais faria diferença no caso de uma invasão ao servidor?

Porque não haveria código a ser escondido

Explicar o uso de certificados digitais é uma parada demorada e estou sem tempo pra isso

Só tô dando uma idéia, vocês podem pesquisar, realmente estou sem tempo, gostaria de discutir mais.

I

Fácil, deixa o class no servidor… se alguém roubar, lance uma atualização do programa invalidando aquele tipo de validação e criando outra. Assim todo mundo que estiver registrado na empresa obterá acesso mediante confirmação do cadastro para implementar uma nova forma de se autenticar e pegar a chave.

Se isso não der certo, bota um httpserver no delphi escondido, que mostra quem é a pessoa que está tentando usar o programa com a chave, se for fria, entra nesse httpserver e invalida o programa dela… hehehehe

Criado 31 de janeiro de 2005
Ultima resposta 2 de fev. de 2005
Respostas 29
Participantes 10