Jump to content

Proteger aplicação: licenças e código fonte


WoOo
 Share

Recommended Posts

Viva,

Tenho andado a investigar um pouco pela web formas de proteger uma aplicação, tanto o código fonte como possíveis tentativas de tentar correr a aplicação num servidor ou domínio para o qual não está autorizada.

Dessa forma gostava de lançar a discussão para se trocar algumas ideias sobre a melhor forma de o fazer.

Começando pelo código, todos sabemos que o PHP não é uma linguagem compilada, porém existem formas de o encriptar/ofuscar  de forma a que mesmo chegando ao código não o consigam alterar ou aproveitar.

Porém ferramentas para tal (casos de phpEncoder ou Zend Guard) são extremamente caras e pessoalmente sou um pouco ceptico em relação a isto, até que ponto a encriptação por vezes não fará com que ocorram erros que inicialmente não existiam? É claro que digo isto apesar de nunca ter usado nenhuma, apenas é a primeira ideia que me ocorre quando se fala em ferramentas do género.

Agora o caso das licenças, imaginemos então que vendem ou oferecem uma aplicação que não corre num servidor vosso, corre por exemplo numa intranet ou mesmo que esteja online é num servidor onde não sabem quem terá acesso.

Que meios temos para garantir que a nossa aplicação só vai correr naquele e apenas naquele servidor ou domínio para o qual está autorizado?

Se a aplicação estiver online, sempre se pode ter a mesma a pingar um servidor nosso validando uma tal "licença" ou algo do genero.

Correndo por exemplo numa intranet tal será mais dificil e aí torna-se a nossa tarefa mais complicada.

Encontrei uma class interessante, embora ainda não a tenha testado como deve de ser, mas dá boas indicações. http://solomongaby.users.phpclasses.org/browse/package/2298.html

Alguem já se deparou com uma situação deste género?

Que soluções sugerem?

Link to comment
Share on other sites

Tenho uma situação idêntica num dos meus projectos (embora não seja em PHP) que passa pela recusa de execução do software em caso de falta de licença.

Uma técnica comum é gerares a licença contra uma chave que é gerada a partir de informação do hardware da máquina em que corre. Se instalarem a aplicação noutra máquina é necessário gerar uma nova licença.

Dado que queres esconder isso, podes sempre ter uma biblioteca nativa para cada sistema que suportes de forma a verificar, a partir do PHP, se a licença é válida.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

Olá,

O modelo de negócio que estás a tentar seguir está tão desactualizado, a meu ver, assim como está um 386 para o windows vista. OK Exagerei, i486DX2.

Se desejas mesmo algo tão selfish, porque não tiras partido da arquitectura  e deixas apenas um servidor no mundo com a tua aplicação e todos os clientes passam a usufruir dela, só e apenas a partir desse servidor.

Podes até, hoje em dia, utilizar Ajax para a pores a funcionar em background noutro "Site" dando a impressão de que cada cliente tem a sua aplicação.

:wallbash: :bye2:

Abraço

Silvino

Link to comment
Share on other sites

Tenho uma situação idêntica num dos meus projectos (embora não seja em PHP) que passa pela recusa de execução do software em caso de falta de licença.

Uma técnica comum é gerares a licença contra uma chave que é gerada a partir de informação do hardware da máquina em que corre. Se instalarem a aplicação noutra máquina é necessário gerar uma nova licença.

Dado que queres esconder isso, podes sempre ter uma biblioteca nativa para cada sistema que suportes de forma a verificar, a partir do PHP, se a licença é válida.

Exacto. é o que faço com muitas das aplicações que uso. Isto é chamado Hardware Fingerprint 👍 procura algo assim em php que certamente deves encontrar digo eu...

Link to comment
Share on other sites

A minha opinião é que isso não deve ser feito em PHP mas sim através de uma biblioteca compilada nativamente para o sistema, dado que assim é mais complexo "dar a volta ao sistema".

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

A minha opinião é que isso não deve ser feito em PHP mas sim através de uma biblioteca compilada nativamente para o sistema, dado que assim é mais complexo "dar a volta ao sistema".

Estou de acordo com o M6, se fizeres directamente ao PHP a "vida de dar a volta fica claramente mais facilitada". eu pessoalmente utilizaria um script GCI feito em C a correr do lado do server e que lê-se determinada informação não replicavel do hardware. Quando digo não-replicavel é mesmo isso. Porque se limitas por exemplo a MAC-Address isso é replicavel, por exemplo.

Uma outra possibilidade mas envolve um pouco mais de complexidade é o uso de chaves assimétricas baseadas no Hardware Fingerprint, ou seja pegares numa serie de valores do hardware, e a conjugação deles com uma chave tua gera-se uma Key, que só funcionaria naquele sistema, e onde nunca o cliente tivesse acesso à tua parte da chave. Sendo que a chave que permita o licenciamento e execução do software seria baseada num valor obtido pelo teu GCI (valor do hardware a licenciar), e a tua chave pessoal, que pode ir tão longe como uma chave biométrica.

Mas resalvo que não existem sistemas perfeitos, não existe segurança perfeita, e quando mais "rebuscado" for o teu sistema de licenciamento mais seguro será. Atenção que "nunca ninguém vê o obvio", ao contrario da electricidade os Humanos procuram sempreo caminho mais dificil, e não o mais curto.

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

apocsantos, esse sistema de chave e contra-chave foi o que eu disse originalmente, são sei é se transmiti isso de forma correcta.

É precisamente esse esquema que uso num dos meus projectos.

Para maior "confidencialidade", podes cifrar isso tudo com algo simples como um AES

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

Eu estou a usar Triple-DES 👍

No primeiro caso o que pensei foi que tivesses a validação apenas a um identificador unico do hardware sem recurso a um algoritmo AES. 

Seria um bom topico debater que outros sistemas ou a que componentes de hardware utilizamos para obter o identificador. Claro que meramente para partilha e desenvolvimento de melhores sistemas de segurança no licenciamento.

Não sei se usas no teu caso a validação em "multiplas fazes", eu normalmente coloco não só no ficheiro principal, mas também em outros ficheiros do programa com nomes de funcção diferentes para a validação, a fim de dificultar a vida a quem queira copiar, uma vez que segundo li à uns anos atraz uma das maneiras mais comuns de "contornar" as licenças é inserir "jmp" no codigo de modo a ultrapassar o conjunto de instruções que validam a licença.

Criando assim um executavel separado (diferente do orignal) contendo o codigo que permita "fazer este contorno".

Cumprimentos.

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

Sim, fazer um .exe com jumps é talvez a técnica mais conhecida/naive de todas.

Mas no meu caso não lido com utilizadores técnicos (do ponto de vista da informática) pelo que não tenho de ter algo tipo "Fort Knox", basta algo simples para dissuadir a cópia ilegal. Estou num nicho de mercado em que não há interessados com conhecimentos técnicos suficientes para fazer algo desse tipo.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

silvinosilva, não sou eu que quero ter aplicações a correr localmente, o problema aqui é aqueles casos em que o cliente não quer ter nada online, fica com medo se por qualquer motivo a ligação à net falhar e consequentemente não pode trabalhar, etc., logo insiste para ter a aplicação a correr no seu próprio servidor.

Pelo menos cá em Portugal ainda ha muita gente céptica em ter algo a correr online, pensa logo que os concorrentes vão estar a vasculhar a sua base de dados descobrindo os seus segredos do negócio.

Link to comment
Share on other sites

Nesse caso, se vais ter a aplicação num servidor de intranet, o nivel de boqueios contra cópia que podes ter são quase infindaveis. Ainda assim o descrito pelo M6 e por mim penso serem eficazes. Podes simplesmente utilizar um GCI e chama-lo apartir do codigo PHP. Se quizeres ir a niveis extremos de segurança tipo "fort-knox" também se pode fazer algumas sugestões 👍

Cumprimentos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

Sim, fazer um .exe com jumps é talvez a técnica mais conhecida/naive de todas.

Mas no meu caso não lido com utilizadores técnicos (do ponto de vista da informática) pelo que não tenho de ter algo tipo "Fort Knox", basta algo simples para dissuadir a cópia ilegal. Estou num nicho de mercado em que não há interessados com conhecimentos técnicos suficientes para fazer algo desse tipo.

Pois.... os Jumps é a tecnica mais antiga, ainda assim tanto quanto soube em conversa com um colega que trabalha na produção de anti-virus ainda é muito utilizada 👍 Hoje em dia com a informação tão "abandalhada" a informação técnica quase que anda "a la google" 🙂 Infelizmente.

Eu estou constantemente a tentar perceber melhores formas de proteger o software, nem que seja com o simples esboçar de algoritmos que em teoria funcionam, e depois se tiver tempo e cabeça passo-os à pratica. Se não tiver, vão para a "stack" (nome que dou à pilha de apontamentos que tenho).

Ainda deves ser do tempo de algums e-zines porreiros onde vinha informação sobre tecnologia e pequenos how-to's que um gajo lia havidamente com vontade de experimentar logo a seguir... 🙂

Sinceramente acho que ao que tenho visto não existe sistema perfeito nem "muito seguro", existem sistemas muito bons, mas é uma "gerra de gato e rato". Eu conformei-me que o meu software vai acabar sendo copiado, não importa o quanto eu me esforce, para mim tudo se trata de "garantir que é tão dificil que não compense". Ainda assim relembro-me que a melhor forma de elogio é a imitação 🙂

Cumprimentos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

A unica dica que me resta deixar-te é dizer-te o que me disseram a mim quando me ensinaram a mais marcante lição sobre segurança "Olha para além do obvio, observa como se estivesses o exterior, observa como se fosses tu a quebrar a segurança que tu estás a montar. Lembra-te que o que está à vista ninguém vê!"

Explicaram-me isto numa aula sobre sistemas de segurança. Quando deixaram algo à vista e toda a gente reparou em tudo, menos no obvio. 👍 Quanto mais "à vista" menos se vê!

Estudar nunca fez mal a ninguém, acho que o "verdadeiro espirito" do informático é mesmo o de estudar e conhecer a fundo todo o sistema, teoria, pratica, limitações, falhas, melhorias, etc...

Ainda me recordo e convivo com alguma regularidade com "informáticos" daqueles com olheiras de quem não dorme "já não se lembra à quanto tempo", toma café, como um ser humano "normal" bebe água, e quando começa a conversar com outro informático, para quem não é da arte, parece que falam alguma coisa tipo "chinês"!

Cumprimentos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

Cool! 🙂 Tá bem castiça a forma de explicar a criptografia.... Eu sinceramente uso Triple-DES ou 3DES, para já ainda é seguro. E pelo andar da carroagem vai ser seguro mais uns anitos!  ?

Quando deixar de ser volta-se a utilizar codigos antigos tipo codigo Enigma 👍

Afinal de contas nunca ninguém se lembraria que alguém estaria a utilizar codigo Enigma, e é pouco vulgar.... é quase "histório" e mais nada 🙂

Penso que no futuro a segurança passará pro criptografia por hardware, e biometria.

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

Já implementei alguns mecanismos do género mas para aplicações compiladas, no caso do PHP e linguagens de script é complicado embora tenhas alguns casos como o IPB que usa validação de licença embora nunca tenha estudado como o fazem.

Por acaso é algo de que tenho curiosidade mas também nunca tive grande tempo e paciência para investigar... De qualquer forma, como o código está ali à mercê de todos, é uma questão de alguém se dedicar a modificar o código e evitar a verificação de licença. Até porque existem mesmo versões que lhes chamam "nullified" onde modificaram precisamente essa parte do código, mas suponho que alguns já devem saber que isso existe :X

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.