Atualmente, estou envolvido no desenvolvimento de um produto (desenvolvido em C #) que estará disponível para download e instalação gratuitamente, mas em uma versão muito limitada. Para ter acesso a todos os recursos, o usuário deve pagar uma taxa de licença e receber uma chave. Essa chave será inserida no aplicativo para "desbloquear" a versão completa.
Como usar uma chave de licença como essa é comum, estou me perguntando:
- Como isso geralmente é resolvido?
- Como posso gerar a chave e como ela pode ser validada pelo aplicativo?
- Como também posso evitar que uma chave seja publicada na Internet e usada por outras pessoas que não pagaram a licença (uma chave que basicamente não é "deles").
Eu acho que também devo vincular a chave à versão do aplicativo de alguma forma, para que seja possível cobrar por novas chaves nas versões dos recursos.
Mais alguma coisa que eu deva pensar nesse cenário?
fonte
Existem muitas maneiras de gerar chaves de licença, mas muito poucas são realmente seguras. E é uma pena, porque para as empresas, as chaves de licença têm quase o mesmo valor que o dinheiro real.
Idealmente, você deseja que suas chaves de licença tenham as seguintes propriedades:
Somente sua empresa deve ser capaz de gerar chaves de licença para seus produtos, mesmo que alguém faça uma engenharia reversa completa de seus produtos (o que acontecerá, falo por experiência própria). Ofuscar o algoritmo ou ocultar uma chave de criptografia dentro do seu software está realmente fora de questão, se você é sério sobre como controlar o licenciamento. Se o seu produto for bem-sucedido, alguém criará um gerador de chaves em questão de dias a partir do lançamento.
Uma chave de licença deve ser utilizável em apenas um computador (ou pelo menos você deve poder controlar isso com muita força)
Uma chave de licença deve ser curta e fácil de digitar ou ditar por telefone. Você não deseja que todos os clientes liguem para o suporte técnico porque eles não entendem se a chave contém um "l" ou um "1". Seu departamento de suporte agradeceria por isso e você terá custos mais baixos nessa área.
Então, como você resolve esses desafios?
A resposta é simples, mas tecnicamente desafiadora: assinaturas digitais usando criptografia de chave pública. Suas chaves de licença devem ser de fato "documentos" assinados, contendo alguns dados úteis, assinados com a chave privada da sua empresa. As assinaturas devem fazer parte da chave de licença. O produto deve validar as chaves de licença com a chave pública correspondente. Dessa forma, mesmo se alguém tiver acesso total à lógica do seu produto, ele não poderá gerar chaves de licença porque não possui a chave privada. Uma chave de licença ficaria assim: BASE32 (CONCAT (DATA, PRIVATE_KEY_ENCRYPTED (HASH (DATA)))) O maior desafio aqui é que os algoritmos clássicos de chave pública têm grandes tamanhos de assinatura. O RSA512 possui uma assinatura de 1024 bits. Você não deseja que suas chaves de licença tenham centenas de caracteres. Uma das abordagens mais poderosas é usar a criptografia de curva elíptica (com implementações cuidadosas para evitar as patentes existentes). As chaves ECC são 6 vezes mais curtas que as chaves RSA, para a mesma força. Você pode reduzir ainda mais o tamanho da assinatura usando algoritmos como o algoritmo de assinatura digital Schnorr (patente expirada em 2008 - bom :))
Isso é possível com a ativação do produto (o Windows é um bom exemplo). Basicamente, para um cliente com uma chave de licença válida, é necessário gerar alguns "dados de ativação", que são uma mensagem assinada incorporando a identificação de hardware do computador como dados assinados. Isso geralmente é feito pela Internet, mas apenas UMA VEZ: o produto envia a chave de licença e o ID do hardware do computador para um servidor de ativação, e o servidor de ativação envia de volta a mensagem assinada (que também pode ser abreviada e fácil de ser ditada pela Internet). telefone). A partir desse momento, o produto não verifica a chave de licença na inicialização, mas os dados de ativação, que precisam do mesmo computador para validar (caso contrário, os DADOS seriam diferentes e a assinatura digital não seria validada).
Bem, basta eliminar caracteres redundantes como "1", "l", "0", "o" de suas chaves. Divida a sequência da chave de licença em grupos de caracteres.
fonte
Resposta simples - Não importa qual esquema você use, ele pode ser quebrado.
Não castigue clientes honestos com um sistema destinado a impedir hackers, pois os hackers o invadirão independentemente.
Um código hash simples vinculado ao email ou similar provavelmente é bom o suficiente. As IDs baseadas em hardware sempre se tornam um problema quando as pessoas precisam reinstalar ou atualizar o hardware.
Boa discussão sobre o assunto: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34
fonte
Ao gerar a chave, não se esqueça de concatenar a versão e criar o número na string em que você calcula o hash. Dessa forma, não haverá uma única chave que desbloqueie tudo o que você já lançou.
Depois de encontrar algumas chaves ou patches flutuando no astalavista.box.sk, você saberá que conseguiu criar algo popular o suficiente para que alguém se desse ao trabalho de quebrar. Alegrar!
fonte
Além do que já foi afirmado ....
Qualquer uso de aplicativos .NET é inerentemente quebrável devido a problemas de idioma intermediário. Uma simples desmontagem do código .NET abrirá seu produto para qualquer pessoa. Eles podem facilmente ignorar seu código de licenciamento nesse momento.
Você não pode nem usar valores de hardware para criar mais uma chave. As máquinas virtuais agora permitem que alguém crie uma imagem de uma máquina 'licenciada' e execute-a em qualquer plataforma que escolher.
Se é um software caro, existem outras soluções. Se não estiver, basta dificultar o suficiente para o hacker casual. E aceite o fato de que haverá cópias não licenciadas por aí eventualmente.
Se o seu produto for complicado, os problemas de suporte inerentes criarão alguma proteção para você.
fonte
O mecanismo C # / .NET que usamos para geração de chave de licença agora é mantido como código aberto:
https://github.com/appsoftware/.NET-Licence-Key-Generator .
Ele é baseado em um sistema de "Verificação Parcial de Chave", o que significa que apenas um subconjunto da chave que você usa para gerar a chave precisa ser compilado no seu distribuidor. Você mesmo cria as chaves, para que a implementação da licença seja exclusiva do seu software.
Como mencionado acima, se seu código puder ser descompilado, é relativamente fácil contornar a maioria dos sistemas de licenciamento.
fonte
Sou um dos desenvolvedores por trás da plataforma de licenciamento de software Cryptolens e trabalho em sistemas de licenciamento desde os 14 anos. Nesta resposta, incluí algumas dicas baseadas na experiência adquirida ao longo dos anos.
A melhor maneira de resolver isso é configurando um servidor de chave de licença que cada instância do aplicativo chamará para verificar uma chave de licença.
Benefícios de um servidor de chave de licença
As vantagens de um servidor de chave de licença é que:
Considerações
Embora a verificação de licenças online ofereça mais controle sobre cada instância do aplicativo, a conexão com a Internet nem sempre está presente (especialmente se você direcionar empresas maiores), por isso precisamos de outra maneira de executar a verificação da chave de licença.
A solução é sempre assinar a resposta da chave de licença do servidor usando um sistema de criptografia de chave pública como RSA ou ECC (possivelmente melhor se você planeja executar em sistemas incorporados). Seu aplicativo deve ter apenas a chave pública para verificar a resposta da chave de licença.
Portanto, caso não haja conexão com a Internet, você pode usar a resposta da chave de licença anterior. Certifique-se de armazenar a data e o identificador da máquina na resposta e verifique se não é muito antiga (por exemplo, você permite que os usuários estejam offline no máximo por 30 dias, etc.) e se a resposta da chave de licença pertence ao dispositivo correto.
Protegendo algoritmos secretos
A maioria dos aplicativos .NET pode sofrer engenharia reversa com bastante facilidade (existe um diassembler fornecido pela Microsoft para obter o código IL e alguns produtos comerciais podem até recuperar o código fonte em, por exemplo, C #). Obviamente, você sempre pode ofuscar o código, mas nunca é 100% seguro.
Na maioria dos casos, o objetivo de qualquer solução de licenciamento de software é ajudar as pessoas honestas a serem honestas (ou seja, que usuários honestos que estejam dispostos a pagar não se esqueçam de pagar após o término de um teste, etc.).
No entanto, você ainda pode ter algum código que de maneira alguma deseja vazar para o público (por exemplo, um algoritmo para prever os preços das ações, etc.). Nesse caso, o único caminho a seguir é criar um terminal de API que seu aplicativo chamará sempre que o método for executado. Requer conexão à Internet, mas garante que seu código secreto nunca seja executado pela máquina cliente.
Implementação
Se você não quiser implementar tudo sozinho, recomendo dar uma olhada neste tutorial (parte do Cryptolens )
fonte
Eu usei Crypkey no passado. É um dos muitos disponíveis.
Você só pode proteger o software até certo ponto com qualquer esquema de licenciamento.
fonte
Eu não sei o quão elaborado você quer ser
mas acredito que .net pode acessar o número de série do disco rígido.
você pode mandar o programa enviar algo assim (como nome de usuário e endereço mac do nic)
você calcula um código com base nisso e envia de volta a chave por e-mail.
eles os impedirão de trocar de máquina depois de terem a chave.
fonte
A única maneira de fazer tudo o que você pediu é exigir um acesso à Internet e verificação com um servidor. O aplicativo precisa entrar no servidor com a chave e, em seguida, você precisa armazenar os detalhes da sessão, como o endereço IP. Isso impedirá que a chave seja usada em várias máquinas diferentes. Geralmente, isso não é muito popular entre os usuários do aplicativo e, a menos que seja um aplicativo muito caro e complicado, não vale a pena.
Você pode ter apenas uma chave de licença para o aplicativo e verificar o lado do cliente se a chave é boa, mas é fácil distribuir essa chave para outros usuários e, com um descompilador, novas chaves podem ser geradas.
fonte
Eu implementei a ativação única baseada na Internet no software da minha empresa (C # .net) que requer uma chave de licença que se refere a uma licença armazenada no banco de dados do servidor. O software atinge o servidor com a chave e recebe informações de licença que são criptografadas localmente usando uma chave RSA gerada a partir de algumas variáveis (uma combinação de CPUID e outras coisas que não mudam frequentemente) no computador cliente e as armazena em o registro.
Requer alguma codificação no servidor, mas funcionou muito bem para nós e eu pude usar o mesmo sistema quando expandimos para o software baseado em navegador. Também fornece ao seu pessoal de vendas informações excelentes sobre quem, onde e quando o software está sendo usado. Qualquer sistema de licenciamento manipulado apenas localmente é totalmente vulnerável à exploração, especialmente com reflexo no .NET . Mas, como todo mundo já disse, nenhum sistema é totalmente seguro.
Na minha opinião, se você não estiver usando o licenciamento baseado na Web, não há sentido real em proteger o software. Com a dor de cabeça que o DRM pode causar, não é justo para os usuários que realmente pagaram pelo sofrimento.
fonte
Acredito firmemente que apenas o sistema de licenciamento baseado em criptografia de chave pública é a abordagem correta aqui, porque você não precisa incluir informações essenciais necessárias para a geração de licenças em seu código-fonte.
No passado, eu usei a Biblioteca de licenciamento da Treek muitas vezes, porque preenche esses requisitos e oferece um preço muito bom. Ele usa a mesma proteção de licença para usuários finais e a si próprio, e ninguém o quebrou até agora. Você também pode encontrar boas dicas no site para evitar pirataria e rachaduras.
fonte
Como alguns outros mencionados, sou um grande oponente por ser hostil aos clientes por padrão - algo pelo qual a indústria de licenciamento é notória. Então, vou expandir uma boa solução para o seu problema que também oferece um bom cliente UX .
Para começar, você mencionou que possui uma versão "limitada" do seu software que está usando para tentar converter clientes em "atualização" para obter recursos adicionais. Portanto, o que você procura são licenças de recursos para seu produto, por exemplo, um cliente pode comprar uma licença para o recurso X ou Y .
Eu construí Keygen com esse tipo de licenciamento em mente. Keygen é uma API REST de licenciamento que permite gerenciar contas de usuários, licenças e também rastrear o uso / associações de máquinas.
O que eu faria é configurar 2 tipos de licença (uma política no Keygen), onde um é uma política básica para a versão gratuita limitada e o outro é uma política para a versão paga.
Não sei ao certo o que você está usando para pagamentos, mas vamos supor que você esteja usando algo como o Stripe (hoje bastante comum hoje em dia) que oferece webhooks . O Keygen também possui webhooks (se você o usa ou não, tudo isso ainda é aplicável). Você pode integrar o Keygen para conversar com seu provedor de pagamento usando webhooks de ambos os lados (pense em:
customer.created
-> criar licença básica para o cliente,license.created
-> cobrar da nova licença).Portanto, utilizando webhooks, podemos automatizar a criação de licenças para novos clientes. E a validação de licença no próprio aplicativo? Isso pode ser feito de várias maneiras, mas a maneira mais popular é exigir que seu cliente insira uma chave de licença longa em um campo de entrada que você poderá validar; Eu acho que essa é uma maneira terrível de lidar com a validação de licença em seu aplicativo.
Por que eu acho isso? Bem, primeiro, você está exigindo que seu cliente insira uma chave de licença tediosamente longa, destinada ao consumo da máquina, e depois você exige que você e seu cliente acompanhem a chave de licença tediosamente longa .
Ok, então o que é uma alternativa? Eu acho que a melhor alternativa é fazer algo que todos os seus clientes estão acostumados: permitir que eles criem uma conta para o seu produto usando um email / senha . Você pode associar todas as suas licenças e máquinas a essa conta. Portanto, agora, em vez de inserir uma chave de licença, eles podem simplesmente fazer login usando suas credenciais.
Que vantagem isso lhe dá? Em primeiro lugar, elimina a necessidade de você e seus clientes acompanharem as chaves de licença, pois tudo é tratado nos bastidores da conta de usuário e, o mais importante: agora você pode oferecer aos seus clientes licença e máquina de autoatendimento ativação! ou seja, como todas as suas licenças e máquinas estão associadas à sua conta de usuário, você pode solicitar que comprem uma licença quando iniciarem o aplicativo em uma máquina não reconhecida.
Agora, para validação da licença : sempre que seus registros de clientes em sua aplicação com o seu e-mail / senha, você pode consultar a sua conta de usuário para as licenças que possui para determinar se eles podem usar recurso de X ou de longa-Y . E como seu aplicativo agora é de autoatendimento , você pode permitir que seus clientes comprem recursos adicionais diretamente de dentro do seu aplicativo!
Por isso, introduzimos uma tonelada de automação em nosso sistema de licenciamento, podemos licenciar recursos individuais (por exemplo, uma versão limitada versus uma versão completa), oferecer um UX incrível para nossos clientes e também aliviar um dos maiores motivos. para solicitações de suporte: recuperação da chave de licença.
Enfim, isso ficou longo, mas espero que ajude alguém!
fonte
Não é possível impedir completamente a pirataria de software. Você pode evitar a pirataria casual e é isso que todas as soluções de licenciamento fazem.
O licenciamento bloqueado do nó (máquina) é melhor se você deseja impedir a reutilização de chaves de licença. Estou usando o Cryptlex há cerca de um ano para o meu software. Também possui um plano gratuito ; portanto, se você não espera muitos clientes, pode usá-lo gratuitamente.
fonte
Você pode usar uma solução gratuita de terceiros para lidar com isso, como Quantum-Key.Net. É gratuito e lida com pagamentos via paypal através de uma página de vendas na web criada para você, emissão de chaves por e-mail e bloqueia o uso de chaves em um computador específico para prevenir a pirataria.
Você também deve ter o cuidado de ofuscar / criptografar seu código, ou ele pode ser facilmente modificado por engenharia reversa usando softwares como De4dot e .NetReflector. Um bom ofuscador de código livre é o ConfuserEx, que é rápido e simples de usar e mais eficaz que as alternativas caras.
Você deve executar o software finalizado através do De4Dot e do .NetReflector para fazer engenharia reversa e ver o que um cracker veria se fizesse a mesma coisa e para garantir que você não deixou nenhum código importante exposto ou indisfarçado.
Seu software ainda estará quebrável, mas para o cracker casual pode ser suficiente adiá-lo e essas etapas simples também impedirão que seu código seja extraído e reutilizado.
https://quantum-key.net
Como usar o ConfuserEx?
https://github.com/0xd4d/de4dot
https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download
fonte