Como proteger o código fonte?

Pergunta :


Estou pensando em fazer uma aplicação para vender, gostaria de saber como proteger meu código fonte para manter meu software seguro.

Eu vi que os bytecodes do Java, armazenados no arquivo .class são facilmente convertidos de volta para .java usando a ferramenta Java Decompiler

Os .class podem ser facilmente encontrados dentro de um .jar para o caso dos desktops, ou até mesmo em um .apk, conforme mostrado nesse post.

Como fazem os milhões de aplicativos no Google Play para protegerem seus códigos fontes? Pois deixá-los expostos me parece meio inseguro, ou não é? Se sim (se é inseguro), tem como eu desenvolver aplicações que mantenham escondido o código fonte em Java para desktop e Android?

EDIÇÃO

A resposta do @mgibsonbr me convenceu de não ser paranoico e querer proteger todo o código fonte, entretanto existem alguns pontos da aplicação que não podem ser revelados por motivo de segurança dos dados, por exemplo:

try {
    String url = "jdbc:mysql://mysql01.meudominio.com/bd";
    Class.forName("com.mysql.jdbc.Driver");
    conn = DriverManager.getConnection(url,"usuario","senha");
    System.out.println("Remote database connection established");
}

Imaginem o estrago se alguém tiver o endereço, o usuário e a senha do seu banco de dados.

Nos comentários o @mgibsonbr tentou responder essa minha dúvida, mas eu não entendi, ou talvez eu não tenha deixado a dúvida clara, enfim.

Sobre o ofuscador, através de testes pude ver que ele funciona. Entretanto tenho dúvidas se ele é mesmo a solução que eu procuro ou se a solução na verdade é remodelar o meu software de uma maneira que não guarde no código fonte nenhum tipo de informações que exijam segredo como por exemplo usuário, senhas e endereços de BD.

Se a solução for remodelar o software, por favor me expliquem como manter um arquivo externo ao código fonte de uma maneira que não seja possível o hacker copiar a parte do meu código fonte que faz a leitura desse arquivo externo, tendo então o código que consegue ler o arquivo, da mesma maneira que meu software faz.

Autor da pergunta: Math

Resposta mgibsonbr:

Não é possível, nem necessário, tomar medidas extremas para proteger o código-fonte. Concentre suas energias naquilo que agrega valor ao seu negócio, em vez de desperdiçá-la “tratando clientes como ladrões e ladrões como clientes”.

É possível proteger o código-fonte?

Não dá para impossibilitar os outros de fazerem engenharia reversa no seu programa, no máximo dá pra dificultar. Ofuscadores de código são uma boa opção, se for simples o bastante de implantá-lo junto ao seu produto. Mas isso não impedirá um atacante dedicado a descobrir como seu software funciona ou, mais simples ainda, simplesmente copiar seu código binário mesmo.

Cabe lembrar que:

  • Da mesma forma que você pode ofuscar seu código, o atacante pode ofuscá-lo novamente e/ou empregar outras técnicas para parecer que o código copiado é diferente do seu. Como provar que é o mesmo código depois? (no caso de uma ação judicial, por exemplo)

  • Você pode precisar realizar ações de diagnóstico no seu programa, depurar partes com problema, etc. Isso se torna bem mais complicado se seu código estiver ofuscado, aumentando seu custo em prestar manutenção aos clientes. Isso se o próprio ofuscador não introduzir algum bug, o que faria com que a versão “desofuscada” funcionasse, mas a ofuscada não.

É necessário para se proteger contra…

Pirataria?

Quem quer copiar seu sistema irá copiá-lo de qualquer forma, independentemente de “entender como ele funciona” ou não. As ferramentas de crack em geral atuam no próprio binário, então não há interesse da parte dos atacantes nos fontes.

Concorrentes?

Se a parte mais difícil de se comercializar um produto fosse construí-lo, então talvez essa medida se justificasse (no caso de aplicativos para dispositivos móveis, não está muito longe disso, mas não tenho experiência suficiente para comentar). Mas há muito mais envolvido: marketing, suporte, melhorar continuamente o produto a partir do feedback dos clientes, etc. Já é um trabalho bastante grande, e isso sem ter que se preocupar em ser processado a qualquer momento por violações de direitos autorais. Um concorrente sério não vai copiar seu código, ainda que você o esfregue na cara dele.

Quanto a “descobrir o que seu código faz”, eu pergunto: isso é mesmo relevante? Existem segredos comerciais nele, ou tecnologias ainda não divulgadas para o público geral, coisas que só você e sua empresa sabem? Se a reposta for sim, então vá em frente e proteja. Caso contrário, não se preocupe muito com isso, provavalmente os seus concorrentes já sabem tudo o que precisam saber sobre seu sistema, o que os impede de copiá-lo nesse exato momento é o custo de oportunidade (i.e. você chegou primeiro, e já conquistou certa clientela, quem vier depois vai ter que fazer esforço extra para roubá-la de você).

Hackers?

Se seu sistema usa “segurança por obscurantismo”, então pare e reveja seu design. Idealmente, os sistemas deveriam se manter seguros ainda que todos os detalhes sobre o algoritmo sejam públicos, apenas a “chave” (ou equivalente) seja secreta. Se não dá para evitar isso, tornar mais difícil ler os fontes vai parar atacantes casuais (script kiddies) mas não os mais dedicados, então leve isso em consideração ao pesar os riscos.

Clientes como ladrões e ladrões como clientes

Se seu aplicativo está numa “App Store”, 95% das pessoas vão simplesmente comprá-lo, não tentar roubá-lo de você (mentira, 20% vão comprar e 75% não vão usar seu aplicativo). E os outros 5% não vão simplesmente dizer “oh, está mais difícil de copiar, acho que só resta eu comprar…” – eles ou vão desistir de vez, ou vão se esforçar um pouquinho mais (lembre-se que basta 1 pessoa crackear e distribuir para todos os outros). De uma forma ou de outra eles não são seus clientes, você não vai receber nenhum dinheiro deles, então que diferença faz se eles copiaram seu aplicativo ou não?

Por outro lado, a tentativa de aplicar DRM (ou qualquer outra medida anti-pirataria) a um sistema pode torná-lo mais lento, cheio de bugs, complicado de instalar/usar/depurar, etc. Isso prejudica seus clientes de fato, aqueles que pagaram por seu produto e esperam por uma experiência de qualidade.

Concluindo, tome sim medidas simples para proteger seu programa quando cabíveis, mas não se preocupe demais com isso. Não dependa do segredo dos fontes para a segurança. E se concentre em criar um produto melhor do que o da concorrência, em vez de ficar preocupado com a concorrência copiar seu produto tal como está agora (e não como estará daqui a 6 meses, por exemplo).

Creio que o ponto não é proteger o código-fonte em si, como muitos já disseram.

No entanto, quero ressaltar essa questão de proteger dados sigilosos. Aplicativos e sistemas robustos não deveriam usar tais mecanismos, isto é, criptografar dados de login e senha.

Primeiro porque o acesso do aplicativo seria melhor feito via um web service, por exemplo, uma API Rest.

O conceito melhor aplicável seria autenticar o usuário nessa API usando um cadastro que ele deve fazer antes de acessar o sistema, por exemplo, usando o e-mail e uma senha ou chave que ele recebe ao se cadastrar.

O aplicativo é então configurado com a conta do usuário e envia o e-mail e a chave a cada requisição que faz ao servidor, o qual então verifica se o mesmo possui acesso à função solicitada, executa a ação necessária e retorna os dados para o aplicativo, por exemplo, via Json, HTML ou XML.

Pensando num outro cenário, por exemplo, onde você faz um aplicativo para pedidos em restaurantes. Cada aplicativo conecta-se diretamente ao banco do restaurante. Nesse caso, os dados de acesso poderiam ser definidos via configuração e não fixos no código.

Não só em aplicativos para mobile, mas em qualquer sistema, eu consideraria uma má prática deixar dados de acesso hard-coded no código.

Existe um ferramente nativa no Android chamada proguard. Muito simples de utilizar, faz o mesmo processo de ofuscação de código java da outras ferramentas.

Basicamente você habilita adicionando no project.properties a linha:

proguard.config=proguard.cfg

Feito isso, toda vez que você gerar um .APK clicando no projeto com o botão direito, indo em Android Tools e depois em Export Signed Application Package, o código será ofuscado. O mesmo vale para a opção Export Unsigned Application Package.

você pode utilizar um modelo do proguard.cfg que fica em na pasta de instalação do SDK tools/proguard/. nesta pasta existe dois arquivos proguard-android.txt e proguard-android-optimize.txt

Fonte e mais informações em https://github.com/exmo/equizmo-android/wiki/Ofuscando-aplicativos-Android

Solução para proteção código fonte


A unica alternativa que encontrei para isso é conhecida como Ofuscamento do .JAR, com ele você vai dificuldade a engenharia reversa em sua aplicação segue abaixo alguns links que explicam sobre o assunto com grandes detalhes.


Links relacionado a Ofuscamento:

  1. Dúvida relacionada
  2. Protegendo o seu código
  3. Java – Sapão
  4. Download PDF Sobre Ofuscamento
  5. Ofuscar código

Programa para Ofuscamento

Utilizo o proGuard para fazer esse ofuscamento dificultando a engenharia reversa no .JAR

Links relacionado ao ProGuard

  • Download
  • Introdução
  • Exemplos

Observação: Os links são para ajudar no entendimento sobre o assunto.

Após ler as várias respostas, quero dizer que concordo com a maioria, mas, tendo eu me debatido não a muito tempo com o mesmo problema gostava de colocar alguns pontos que acho importante referir.

  1. O código Java é totalmente dependente dos binários da JVM, pelo que, para ser executado e aproveitando todas as suas características, este, será sempre dependente da JVM, logo dependente de alguém ou de algo. Não é por acaso que as multinacionais investem milhões em linguagens de programação e ou plataformas.

  2. A motivação para violar um código fonte de um qualquer software é dependente do valor que o mercado atribuí à solução e ao seu custo de licença de utilização, ou seja, mais sucesso mais investimento por quem protege como por quem “ataca”

  3. Para proteger uma solução proprietária várias podem ser as soluções mas claramente não pelo código.

Hoje uma solução de software é muito mais que um produto… A tendência é cada vez mais ser um produto com serviços ou conjunto de serviços.

Na minha opinião um sistema de licenciamento é essencial pois hoje um software é muito mais que o seu código fonte, é também um mercado especifico… e porque tudo custa dinheiro mesmo o que é de borla tem um custo, é importante conhecer o mercado que o nosso produto final de software conquista, para então se tomar decisões.

Em muitos sistemas também é importante entregar algum nível de segurança e controlo de dados e um sistema licenciamento ajuda e muito.

Ter um sistema de licenciamento não quer dizer ter o código inviolável, coloca apenas um controle sobre quem usa quando e como… As soluções tecnológicas estão aí…seja criptografia, webservices que colocam o segredo do negócio no lado dos servidores, etc.

Claro que devemos tornar a vida mais difícil a quem tente violar o código fonte e para isso, recorre ao que melhor se adequar a tua solução.

Um utilizador é sempre um potencial cliente e com isso em mente o céu é o limite.

Bom eu ja baixe apk e já apliquei engenharia reversa no programa dos outros para ver como eram feitos. No meu caso como sou programador de Games queria tirar algumas ideias, mas nunca peguei um código fonte na integra, apenas via o que tinha de bom e otimizava meu próprio código. Achei muita Classe que vinha no próprio java e desconhecia, colocando-o no meu projeto e agilizando o serviço. O máximo que irão fazer é tirar idéias da parte boa de seu código, só de você remover os comentários ja atrapalha bastante, pq o comentários podem ser recuperados, já as variáveis não, eles viram como var1, var2, var3… Dai tem que se deduzi o que foi feito ali.

A melhor maneira de você proteger seu código fonte é não disponibiliza-lo para o usuário. Hospede o código fonte no servidor e forneça o acesso aos recursos apenas a usuários autenticados, um webservice.

É possível fazer uma aplicação com a plataforma Java Enterprise Edition (JEE) no backend, que possui diversas tecnologias:

  • Servlets – São componentes Java executados no servidor que tem o objetivo de gerar conteúdo (HTML e XML) dinâmico para web.

  • Java Server Pages (JSP) – Especialização de servlets que permite aplicações em Java serem mais robustas e tenham facilidades no desenvolvimento.

  • Java Server Faces (JSF) – É framework web com o padrão MVC (Model, View e Controller) baseado em Java que ajuda a simplificar o desenvolvimento de interfaces (telas do sistema) através de um modelo de UI.

  • Java Persistence API (JPA) – É uma API padrão do Java que usa o conceito de mapeamento objeto relacional, sendo utilizada para a persistência dos dados. Essa ferramenta traz muita produtividade, pois consegue desenvolver aplicações que trabalham com banco de dados sem escrever nenhuma linha SQL.

  • Enterprise Java Beans (EJB) – São componentes que executam em um container de aplicação e que oferecem a facilidade e produtividade no desenvolvimento de componentes distribuídos, transacionados, seguros e portáteis.

  • JDBC (Java Database Connectivity), utilizado no acesso e conexão ao banco de dados.

Fontes:

http://respostas.guj.com.br/51696-tecnologias-mais-utilizadas-no-desenvolvimento-de-sites-em-java

https://www.devmedia.com.br/jee-um-caminho-prazeroso-e-interessante/3747

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *