Pergunta

Atualmente estou envolvido no desenvolvimento de um produto (desenvolvido em C #), que estará disponível para download e instalação de graça, mas em uma versão muito limitada. Para ter acesso a todas as funcionalidades que o usuário tem que pagar uma taxa de licença e receber uma chave. Essa chave será, então, entrou em aplicação para "destravar" a versão completa.

Como usar uma chave de licença como essa é uma espécie de costume, eu estou querendo saber:

  1. Como do que normalmente resolvido?
  2. Como posso gerar a chave e como ele pode ser validado pela aplicação?
  3. Como posso também evitar ter uma chave ser publicado na Internet e utilizada por outras pessoas que não tenham pagos a licença (uma chave que, basicamente, não é "deles").

Eu acho que eu também deve amarrar a chave para a versão do aplicativo de alguma forma, por isso vai ser possível cobrar por novas chaves em versões de recursos.

Qualquer outra coisa que eu deveria pensar nesse cenário?

Foi útil?

Solução

Aviso: você não pode impedir que os usuários de pirataria, mas apenas tornar mais fácil para usuários honestos para fazer a coisa certa .

Supondo que você não quer fazer uma compilação especial para cada usuário, então:

  • Gerar-se uma chave secreta para o produto
  • Leve o usuário nome
  • Concatentate o nome usuários e a chave secreta e hash com (por exemplo) SHA1
  • Descompacte o hash SHA1 como uma seqüência alfanumérica. Este é o usuário individual "Product Key"
  • Dentro do programa, faça o mesmo hash, e comparar com a chave do produto. Se for igual, OK.

Mas, repito: isso não vai impedir a pirataria


Eu li recentemente que esta abordagem não é criptograficamente muito som. Mas esta solução já é fraca ( como o próprio software tem de incluir a algum lugar chave secreta ), então eu não acho que esta descoberta invalida a solução, na medida em que vai.

Apenas pensei que eu realmente deveria mencionar isso, embora; Se você está planejando a algo derivam os outros a partir deste, cuidado.

Outras dicas

Existem muitas maneiras de gerar chaves de licença, mas muito poucos dessas formas são verdadeiramente segura. E é uma pena, porque para as empresas, as chaves de licença têm quase o mesmo valor como dinheiro real.

Idealmente, você iria querer suas chaves de licença para ter as seguintes propriedades:

  1. Apenas sua empresa deve ser capaz de gerar chaves de licença para seus produtos, mesmo se alguém engenheiros reverter completamente os seus produtos (que vai acontecer, falo por experiência própria). Ofuscar o algoritmo ou escondendo uma chave de criptografia dentro do seu software é realmente fora de questão se você é sério sobre o controle de licenciamento. Se o produto for bem sucedido, alguém vai fazer um gerador de chaves em questão de dias de lançamento.

  2. Uma chave de licença deve ser utilizável em apenas um computador (ou pelo menos você deve ser capaz de controlar esta com muito rigor)

  3. Uma chave de licença deve ser curto e fácil de digitar ou ditar por telefone. Você não quer que cada cliente chamando o suporte técnico, porque eles não entendem se a chave contém um "l" ou um "1". O seu departamento de suporte seria obrigado por isso, e você terá menores custos nesta área.

Assim como você resolver estes desafios?

  1. A resposta é simples, mas tecnicamente desafiador: assinaturas digitais usando criptografia de chave pública. Suas chaves de licença deve ser de fato assinado "documentos", que contém alguns dados úteis, assinado com a chave privada da sua empresa. As assinaturas devem ser parte da chave de licença. O produto deve validar as chaves de licença com a chave pública correspondente. Desta forma, mesmo se alguém tem acesso completo a lógica do seu produto, eles não podem gerar chaves de licença, porque eles não têm 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 de chave pública clássicos têm grandes tamanhos de assinatura. RSA512 tem uma assinatura de 1024 bits. Você não quer que suas chaves de licença para ter centenas de personagens. Uma das abordagens mais poderosos é a utilização de criptografia de curva elíptica (com implementações cuidado para evitar as patentes existentes). chaves ECC são como 6 vezes mais curto do que chaves RSA, para a mesma força. Você pode reduzir ainda mais os tamanhos de assinatura usando algoritmos como o algoritmo de assinatura digital Schnorr (patente expirou em 2008 - boa :))

  2. Isso é possível pela ativação do produto (Windows é um bom exemplo). Basicamente, para um cliente com uma chave de licença válida, você precisa gerar alguns "dados de ativação", que é uma mensagem assinada a incorporação id hardware do computador como os dados assinados. Isso geralmente é feito através da internet, mas apenas uma vez: o produto envia a chave de licença ea ID de 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 feita curto e fácil de ditar sobre o telefone). Daquele momento em diante, o produto não verifica a chave de licença na inicialização, mas os dados de ativação, que precisa do computador para ser o mesmo para validar (caso contrário, os dados seria diferente e a assinatura digital não iria validar). Note-se que a verificação dos dados de ativação não exigem verificação através da Internet:. É suficiente para verificar a assinatura digital dos dados de ativação com a chave pública já incorporado no produto

  3. Bem, simplesmente eliminar personagens redundantes como "1", "l", "0", "o" de suas chaves. Dividir a string chave de licença em grupos de caracteres.

A resposta é simples -. Não importa o esquema que você usá-lo pode ser quebrada

Não punir clientes honestos com um sistema destinado a impedir que hackers, como hackers vai quebrá-la de qualquer maneira.

Um código hash simples amarrado ao seu e-mail ou similar é provavelmente bom o suficiente. IDs baseados em hardware sempre se tornar um problema quando as pessoas precisam para reinstalar ou hardware atualização.

Boa rosca sobre a questão: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34

Ao gerar a chave, não se esqueça de concatenar a versão e número de compilação para a seqüência que você calcular o hash diante. Dessa forma, não haverá uma única chave que abre todas tudo o que você já lançado.

Depois de encontrar algumas chaves ou manchas que flutuam no astalavista.box.sk você vai saber que você conseguiu fazendo algo bastante popular que alguém se preocupou em crack. Alegra-te!

Além do que já foi dito ....

Qualquer uso de aplicações .NET são inerentemente frágeis por causa das questões de linguagem intermediária. Um simples desmontagem do código .NET irá abrir o seu produto a qualquer um. Eles podem facilmente contornar o seu código de licenciamento nesse ponto.

Você não pode mesmo usar valores de hardware para criar uma chave mais. As máquinas virtuais permitem agora alguém para criar uma imagem de uma máquina 'licenciado' e executá-lo em qualquer plataforma que escolher.

Se é caro software existem outras soluções. Se não for, apenas torná-lo o suficiente difícil para o hacker casual. E aceitar o fato de que não será sem licença cópias lá fora eventualmente.

Se o seu produto é complicado, os problemas de suporte inerentes será criar alguma proteção para você.

A C # / motor .NET usamos para a geração de chave de licença é agora mantido como código aberto:

https://github.com/appsoftware/.NET-Licence-Key- Generator .

É baseado em um sistema de "parcial Verificação da Chave", que significa apenas um subconjunto da chave que você usa para gerar a chave tem de ser compilado em seu distribuível. Você cria as chaves de seu self, de modo a implementação licença é exclusivo para o seu software.

Como dito acima, se o seu código pode ser compilado, é relativamente fácil de contornar sistemas mais de licenciamento.

Eu usei CrypKey no passado. É um dos muitos disponíveis.

Você só pode proteger o software até certo ponto com qualquer esquema de licenciamento.

Eu não sei como elaborar você deseja obter

Mas acredito que .net pode acessar o número de série do disco rígido.

você poderia ter o send programa que e algo ELES (como nome de usuário e endereço MAC do NIC)

você calcular um código baseado fora isso e enviá-las de volta a chave.

eles vão mantê-los de mudar máquinas depois que eles têm a chave.

Eu sou um dos desenvolvedores por trás do Cryptolens plataforma de licenciamento de software e têm vindo a trabalhar em sistemas de licenciamento desde a idade de 14. Nesta resposta, eu incluí algumas dicas com base na experiência adquirida ao longo dos anos.

A melhor maneira de resolver isso é através da criação de um servidor de chave de licença que cada instância do aplicativo será chamada, a fim de verificar uma chave de licença.

Benefícios de um servidor de chave de licença

As vantagens com um servidor de chave de licença é que:

  1. você sempre pode atualizar ou bloquear uma chave de licença com efeito imediato.
  2. cada chave de licença pode ser bloqueado para certo número de máquinas (o que ajuda a impedir os utilizadores de publicar a chave de licença on-line para os outros de usar).

Considerações

Embora a verificação de licenças online dá-lhe mais controle sobre cada instância do aplicativo, conexão com a internet não está sempre presente (especialmente se você segmentar as grandes empresas), por isso precisamos de uma outra maneira de realizar a verificação da chave de licença.

A solução é sempre assinar a resposta chave de licença do servidor usando um sistema de criptografia de chave pública, tais como RSA ou ECC (possivelmente melhor se você pretende executar em sistemas embarcados). Sua aplicação deve ter apenas a chave pública para verificar a resposta chave de licença.

Portanto, no caso não há nenhuma conexão com a internet, você pode usar a resposta chave de licença anterior em vez. Certifique-se de armazenar tanto o data e máquina identificador na resposta e verificar que não é muito velho (ex. Você permitir que os usuários sejam desligada na maioria dos 30 dias, etc ) e que a resposta chave de licença pertence ao dispositivo correto.

Nota você deve sempre verificar o certificado de resposta chave de licença, mesmo se você estiver conectado à Internet), a fim de garantir que ele não foi alterado desde que deixou o servidor (isso ainda tem que ser feito mesmo se sua API para o servidor de chave de licença usa https)

Proteger algoritmos secretos

A maioria dos aplicativos .NET pode ser a engenharia reversa muito facilmente (há tanto um diassembler fornecido pela Microsoft para obter o código IL e alguns produtos comerciais podem recuperar o código-fonte em, por exemplo. C #). Claro, você sempre pode ofuscar o código, mas nunca é 100% seguro.

I maioria dos casos, o objetivo de qualquer solução de licenciamento de software é ajudar as pessoas honestas sendo honesto (ou seja, que os usuários honestos que estão dispostos a pagar não se esqueça de pagar depois de um julgamento expira, etc).

No entanto, você ainda pode ter algum código que você de nenhuma maneira quer vazar para o público (por exemplo. Um algoritmo para prever os preços das ações, etc). Neste caso, a única maneira de ir é criar um API endpoint que sua aplicação vai chamar cada vez que o método deve ser executado. Ele requer conexão com a internet, mas garante que o seu código secreto nunca é executado pela máquina cliente.

Implementação

Se você não quiser implementar tudo sozinho, eu recomendo dar uma olhada este tutorial (parte do Cryptolens )

A única maneira de fazer tudo o que você pediu é exigir um acesso à Internet e verificação com um servidor. As necessidades de aplicação para iniciar sessão no para o servidor com a chave, e então você precisa para armazenar os detalhes da sessão, como o endereço IP. Isso vai evitar que a chave seja usado em várias máquinas diferentes. Isso geralmente não é muito popular entre os usuários do aplicativo, ea menos que esta é uma aplicação muito caro e complicado, não vale a pena.

Você poderia apenas ter uma chave de licença para a aplicação, e em seguida, verificar do lado do cliente se a chave é bom, mas é fácil de distribuir essa chave para outros usuários, e com um decompiler novas chaves podem ser geradas.

Eu tenho implementado ativação única na Internet sobre 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 é então criptografada localmente usando uma chave RSA gerada a partir de algumas variáveis ??(uma combinação de CPUID e outras coisas que não vai mudar frequentemente) no computador cliente e, em seguida, armazena-lo em o registo.

Ela exige alguma codificação do lado do servidor, mas funcionou muito bem para nós e eu era capaz de usar o mesmo sistema quando expandido para software baseado em browser. Ele também dá seu pessoal de vendas grande informação sobre quem, onde e quando o software está sendo usado. Qualquer sistema de licenciamento que é tratado apenas localmente é totalmente vulneráveis ??à exploração, especialmente com reflexo no .NET . Mas, como toda a gente tem dito, nenhum sistema é totalmente seguro.

Na minha opinião, se você não estiver usando o licenciamento baseada na Web, não há nenhum ponto real para proteger o software em todos. Com a dor de cabeça que o DRM pode causar, não é justo para os usuários que realmente pagou por ele sofrer.

Eu acredito fortemente, que o sistema de licenciamento baseado em chave única pública criptografia é a abordagem correta aqui, porque você não tem que incluir informações essenciais necessárias para a geração de licença em seu código fonte.

No passado, eu usei Licenciamento Biblioteca de treek muitas vezes, porque -lo fullfills estes requisitos e ofertas realmente bom preço. Ele usa a mesma proteção de licença para usuários finais e em si e ninguém rachado que até agora. Você também pode encontrar boas dicas no site para a pirataria evitar e rachaduras.

Como alguns outros mencionados, eu sou um grande oponente de ser hostil aos clientes por padrão, algo que a indústria de licenciamento é notório por. Então, eu vou expandir em uma boa solução para o seu problema que também oferece um bom cliente UX .

Para começar, você mencionou que você tem uma versão "limitada" do seu software que você está usando para tentar clientes converter-se ao "upgrade" para funções adicionais. Então, o que você está procurando são licenças recurso para o seu produto, por exemplo, um cliente pode comprar uma licença para característica-X ou recurso-Y .

Keygen com este tipo de licenciamento em mente. Keygen é uma API REST de licenciamento que permite gerenciar contas de usuário, licenças e também controlar o uso da máquina / associações.

O que gostaria de fazer é criar 2 tipos de licença (a política dentro Keygen) onde um é uma política de base para a versão gratuita limitada, e o outro é um política para a versão paga.

Eu não tenho certeza que você está usando para pagamentos, mas vamos supor que você está usando algo como Stripe (bastante normal nos dias de hoje), que oferece webhooks . Keygen também tem webhooks (se você usá-lo ou não, tudo isso ainda é aplicável). Você pode integrar Keygen para conversar com seu provedor de pagamento usando webhooks de ambos os lados (pense: customer.created-> criar licença base para o cliente, license.created-> cliente taxa para a nova licença).

Assim, utilizando webhooks, podemos automatizar a criação de licença para novos clientes. Assim que sobre validação de licença dentro do próprio aplicativo? Isso pode ser feito em uma variedade de formas, mas a forma mais popular é exigindo o seu cliente para entrar uma chave de licença muito tempo em um campo de entrada que você pode então validar; Eu acho que esta é uma terrível maneira de validação de licença alça na sua aplicação.

Por que eu acho que? Bem em primeiro lugar, você está exigindo o seu cliente a entrada de uma chave de licença tediosamente longa que serve para o consumo máquina, e segundo seu exigindo que você e seu cliente para manter um registo da referida chave de licença tediosamente longa .

Ok, então o que é uma alternativa? Eu acho que a melhor alternativa é fazer algo todos os seus clientes são utilizados para: permitindo-lhes criar uma conta para o seu produto usando um e-mail / senha . Você pode, então, associar todas as suas licenças e suas máquinas com essa conta. Então, agora, em vez de introduzir uma chave de licença, eles podem simplesmente faça o login usando suas credenciais.

Que vantagem é que isso lhe dá? Em primeiro lugar, ele se livrar da necessidade para você e seus clientes a manter o controle de chaves de licença, , uma vez que está tudo tratado por trás das cenas dentro de sua conta de usuário e mais importante: você pode agora oferecer aos seus clientes de auto-serviço de ativação de licença e máquina ou seja, uma vez que todas as suas licenças e máquinas estão associados à sua conta de usuário, você pode! levá-los a comprar uma licença quando o fogo até a sua aplicação em uma máquina não reconhecida.

Agora, para licença de validação : 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 em funcionalidades X ou recurso-Y . E uma vez que a sua aplicação é agora self-service , você pode permitir que seus clientes a comprar recursos adicionais diretamente de dentro de seu aplicativo!

Então, nós introduzimos uma tonelada de automação para o nosso sistema de licenciamento, podemos licença individual apresenta (ou seja, um limitado vs. versão completa), nós oferecemos um incrível UX para os nossos clientes e nós também aliviou um dos maiores motivos para os pedidos de apoio:. recuperação de chave de licença

De qualquer forma, isso tem muito tempo, mas espero que isso ajude alguém!

Não é possível para evitar a pirataria de software completamente. Você pode evitar a pirataria casual e isso é o que todas as soluções de licenciamento a sua afazeres.

Node (máquina) de licenciamento bloqueado é melhor se você quiser evitar a reutilização de chaves de licença. Tenho vindo a utilizar Cryptlex para cerca de um ano para o meu software. Ele tem um plano gratuito também, então se você não espere muitos clientes, você pode usá-lo gratuitamente.

Você pode usar uma solução gratuita terceiros para lidar com isso para você, como Quantum-Key.Net É pagamentos livres e alças via PayPal através de uma página de vendas web que ele cria para você, emissão de chave via email e bloqueia o uso chave para uma computador específico para evitar a pirataria.

Seu deve também tomar cuidado para ofuscar / criptografar seu código ou ele pode ser facilmente engenharia reversa usando softwares como o De4dot e .NetReflector. Um bom obfuscator código livre é ConfuserEx wich é rápido e simples de usar e mais eficaz do que as alternativas caras.

Você deve executar o software acabado através De4Dot e .NetReflector a engenharia reversa e ver o que um cracker poderia ver se eles fizeram a mesma coisa e ter a certeza que não deixou qualquer código importante expostos ou indisfarçável.

O software ainda será atacada, mas para o cracker ocasional pode muito bem ser o suficiente para colocá-los fora e estes passos simples também vai impedir que seu código que está sendo extraído e re-utilizado.

https://quantum-key.net

Como usar ConfuserEx?

https://github.com/0xd4d/de4dot

https://www.red-gate.com / dinâmico / products / dotnet-desenvolvimento / reflector / download

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top