Como posso criar uma chave de produto para meu aplicativo C #?


90

Como posso criar uma chave de produto para meu aplicativo C #?

Preciso criar uma chave de produto (ou licença) que atualizo anualmente. Além disso, preciso criar um para versões de teste.

Relacionado:



@stukelly que foi postado após J3r3myK postar sua pergunta ...
Dozer789

Respostas:


83

Você pode fazer algo como criar um registro que contenha os dados que deseja autenticar no aplicativo. Isso pode incluir o que você quiser - por exemplo, recursos do programa para habilitar, data de expiração, nome do usuário (se você quiser vinculá-lo a um usuário). Em seguida, criptografe-o usando algum algoritmo de criptografia com uma chave fixa ou faça um hash. Depois, basta verificar no seu programa. Uma forma de distribuir o arquivo de licença (no Windows) é fornecê-lo como um arquivo que atualiza o registro (evita que o usuário tenha que digitá-lo).

Porém, tenha cuidado com a falsa sensação de segurança - mais cedo ou mais tarde alguém simplesmente corrigirá seu programa para pular essa verificação e distribuir a versão corrigida. Ou, eles vão trabalhar em uma chave que passa em todas as verificações e distribuí-la, ou atrasar o relógio, etc. Não importa o quão complicado você faça seu esquema, qualquer coisa que você fizer para isso acabará por ser segurança através da obscuridade e eles sempre serão ser capaz de fazer isso. Mesmo se não puderem, alguém o fará e distribuirá a versão hackeada. O mesmo se aplica mesmo se você fornecer um dongle - se alguém quiser, eles também podem remendar o cheque. Assinar digitalmente seu código não ajudará, eles podem remover a assinatura ou renunciar a ela.

Você pode complicar um pouco as coisas usando técnicas para evitar que o programa seja executado em um depurador, etc., mas mesmo isso não é à prova de balas. Portanto, você deve dificultar o suficiente para que um usuário honesto não se esqueça de pagar. Também tenha muito cuidado para que seu esquema não se torne obstrutivo para os usuários pagantes - é melhor ter algumas cópias roubadas do que os clientes pagantes não poderem usar o que pagaram.

Outra opção é ter uma verificação online - basta fornecer ao usuário um ID exclusivo e verificar online quais recursos esse ID deve ter e armazená-lo em cache por algum período. Todas as mesmas advertências se aplicam - as pessoas podem contornar qualquer coisa assim.

Considere também os custos de suporte de ter que lidar com usuários que esqueceram sua chave, etc.

editar: Eu só quero adicionar, não invista muito tempo nisso ou pense que de alguma forma seu esquema complicado será diferente e indecifrável. Não vai e não pode durar enquanto as pessoas controlarem o hardware e o sistema operacional em que seu programa é executado. Os desenvolvedores têm tentado criar esquemas cada vez mais complexos para isso, pensando que, se desenvolverem seu próprio sistema para isso, ele será conhecido apenas por eles e, portanto, 'mais seguro'. Mas é realmente o equivalente em programação de tentar construir uma máquina de movimento perpétuo. :-)


1
Bom resumo. Se alguém não acredita que é simples contornar, procure o CheatEngine, ele torna muito fácil não programadores fazerem isso. Melhor tornar esta camada simples.
Kelly

Eu tenho o mesmo problema, fiz uma chave de licença para meu aplicativo com a data de validade e a última data de registro para verificação, mas o problema é que tenho que adicionar a chave privada para editar o arquivo para atualizar a última data de registro que é não é uma maneira inteligente de colocar a chave no código. algum conselho?
Doicare

16

Em quem você confia?

Sempre considerei essa área crítica demais para confiar em terceiros para gerenciar a segurança de tempo de execução de seu aplicativo. Depois que esse componente é quebrado para um aplicativo, ele é quebrado para todos os aplicativos. Aconteceu com a Discreet em cinco minutos quando eles lançaram uma solução de licença de terceiros para o 3ds Max anos atrás ... Bons tempos!

Sério, considere lançar o seu próprio para ter controle total sobre seu algoritmo. Se você fizer isso, considere o uso de componentes em sua chave ao longo das linhas de:

  • Nome da licença - o nome do cliente (se houver) que você está licenciando. Útil para gerenciar implantações de empresas - faça com que eles se sintam especiais por ter um nome "personalizado" nas informações de licença que você fornece.
  • Data de expiração da licença
  • Número de usuários a serem executados sob a mesma licença. Isso pressupõe que você tem uma maneira de rastrear as instâncias em execução em um site, de forma servidor
  • Códigos de recurso - para permitir que você use o mesmo sistema de licenciamento em vários recursos e em vários produtos. É claro que, se for crackeado para um produto, é para todos.

Em seguida, faça uma verificação total deles e adicione qualquer criptografia (reversível) que você quiser para torná-la mais difícil de quebrar.

Para fazer uma chave de licença de teste, basta definir os valores para os valores acima que se traduzem como "modo de teste".

E como este é provavelmente o código mais importante em seu aplicativo / empresa, além de / em vez de ofuscação, considere colocar as rotinas de descriptografia em um arquivo DLL nativo e simplesmente P / Invoke nele.

Várias empresas para as quais trabalhei adotaram abordagens generalizadas para isso com grande sucesso. Ou talvez os produtos não valiam a pena quebrar;)


3
A criptografia FYI é sempre reversível, seria inútil não conseguir ler o que foi criptografado. Hashing é a única forma de 'criptografia' que você pode estar pensando.
Samuel

"Não role seu próprio esquema de criptografia", que eu acho que é de Bruce Scheier (não tenho certeza), é o caminho a percorrer. Você pode querer dar uma olhada nesta resposta: security.stackexchange.com/questions/2202/…
Shadok,

Você pode explicar "..P / Invoke to it". Eu olhei para a página do link, mas não me tornou mais sábio: - /
MrCalvin

11

Se você estiver perguntando sobre as chaves que você pode digitar, como as chaves de produto do Windows, elas são baseadas em algumas verificações. Se você está falando sobre as chaves que devem ser copiadas e coladas, elas são baseadas em uma assinatura digital (criptografia de chave privada).

Uma lógica de chave de produto simples pode ser começar dizendo que a chave de produto consiste em quatro grupos de 5 dígitos, como abcde-fghij-kljmo-pqrst , e então ir para especificar relacionamentos internos como f + k + p devem ser iguais a, significando os primeiros dígitos de 2 , 3 e 4 grupos devem totalizar a. Isso significa que 8xxxx-2xxxx-4xxxx-2xxxx é válido, então é 8xxxx-1xxxx-0xxxx-7xxxx. Claro, haveria outras relações também, incluindo relações complexas como, se o segundo dígito do primeiro grupo for ímpar, então o último dígito do último grupo também deveria ser ímpar. Dessa forma, haveria geradores de chaves de produto e a verificação das chaves de produto seria simplesmente verificar se ela atende a todas as regras.

A criptografia é normalmente a sequência de informações sobre a licença criptografada usando uma chave privada (== assinada digitalmente) e convertida em Base64 . A chave pública é distribuída com o aplicativo. Quando a string Base64 chega, ela é verificada (== descriptografada) pela chave pública e, se considerada válida, o produto é ativado.


8

Quer seja trivial ou difícil de decifrar, não tenho certeza se realmente faz muita diferença.

A probabilidade de seu aplicativo ser crackeado é muito mais proporcional à sua utilidade do que à força do manuseio da chave do produto.

Pessoalmente, acho que existem duas classes de usuários. Aqueles que pagam. Aqueles que não o fazem. Aqueles que o fizerem provavelmente o farão mesmo com a proteção mais trivial. Aqueles que não o fizerem vão esperar por um crack ou procurar outro lugar. De qualquer forma, você não receberá mais dinheiro.


6

Tenho que admitir que faria algo bastante insano.

  1. Encontre um afunilamento de CPU e extraia-o para um P / Invokeable arquivo DLL .
  2. Como uma ação pós-compilação, criptografe parte do arquivo DLL com uma chave de criptografia XOR.
  3. Selecione um esquema de chave pública / privada, inclua a chave pública no arquivo DLL
  4. Organize de forma que descriptografar a chave do produto e fazer o XOR das duas metades juntas resultem na chave de criptografia para a DLL.
  5. No código DllMain da DLL, desabilite a proteção (PAGE_EXECUTE_READWRITE) e decifre-a com a chave.
  6. Faça um método LicenseCheck () que faça uma verificação de integridade da chave de licença e dos parâmetros e, em seguida, faça a soma de verificação de todo o arquivo DLL, gerando violação de licença em ambos. Ah, e faça alguma outra inicialização aqui.

Quando eles encontrarem e removerem o LicenseCheck, será divertido quando o DLL começar a apresentar falhas de segmentação .


Isso não precisaria ser desativado pela DEP?
Rowland Shaw

Não. A configuração de PAGE_EXECUTE_READWRITE é a maneira correta documentada de escrever código de automodificação e limpar o bit NX apenas nessa página.
Josué

8
Essa técnica geral era muito popular no final dos anos 80. Seu ponto fraco é que o código "secreto" é descriptografado na RAM, tornando mais fácil roubar qualquer cópia do software em execução.
Ray Burns

5

Existe a opção Licenciamento e Proteção de Software Microsoft (SLP). Depois de ler sobre isso, eu realmente gostaria de poder usá-lo.

Gosto muito da ideia de bloquear partes do código com base na licença. Coisas interessantes e o mais seguro para .NET. Leitura interessante mesmo que você não use!

Os Serviços de Licenciamento e Proteção de Software Microsoft® (SLP) são um serviço de ativação de software que permite que fornecedores de software independentes (ISVs) adotem termos de licenciamento flexíveis para seus clientes. O Microsoft SLP Services emprega um método de proteção exclusivo que ajuda a proteger seu aplicativo e informações de licenciamento, permitindo que você entre no mercado mais rapidamente e, ao mesmo tempo, aumente a conformidade do cliente.

Observação: esta é a única maneira de lançar um produto com código confidencial (como um algoritmo valioso).


Para aqueles que lembram que foi cancelado: SLP é relançado novamente
Michael Olesen

5

Se você deseja uma solução simples apenas para criar e verificar números de série, experimente o Ellipter . Ele usa criptografia de curvas elípticas e tem um recurso de "Data de Expiração" para que você possa criar versões de teste ou chaves de registro com limite de tempo.


2

Outra boa ferramenta barata para chaves de produto e ativações é um produto chamado InstallKey. Dê uma olhada em www.lomacons.com


2

Um método simples é usar um Globally Unique Identifier (GUID). GUIDs geralmente são armazenados como valores de 128 bits e são comumente exibidos como 32 dígitos hexadecimais com grupos separados por hifens, como {21EC2020-3AEA-4069-A2DD-08002B30309D}.

Use o seguinte código em C # por System.Guid.NewGuid().

getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string.

_key = Convert.ToString(Regex.Replace(getKey, ".{4}", "$0/")); // And use this to separate every four digits with a "/".

Espero que ajude.


1

O truque é ter um algoritmo que só você conheça (de forma que possa ser decodificado na outra extremidade).

Existem coisas simples como, "Escolha um número primo e adicione um número mágico a ele"

Opções mais complicadas, como o uso de criptografia assimétrica de um conjunto de dados binários (que pode incluir um identificador único, números de versão, etc.) e distribuir os dados criptografados como a chave.

Pode ser também vale a pena ler as respostas para esta pergunta , bem


6
"O truque é ter um algoritmo que só você conheça" - essa é a definição de segurança por obscuridade, e uma ideia realmente ruim.
Nick Johnson

3
Todo licenciamento é feito por um algoritmo que envolve segredos. O licenciamento é geralmente mais bem abordado investindo em advogados, em vez da corrida armamentista de chegar a chaves "inquebráveis"
Rowland Shaw

+1 para o comentário sobre a aplicação da licença por meios legais
Rob

Sim, todo licenciamento é fraco, assim como o DRM. Confiar em um algoritmo secreto é comprovadamente mais fraco .
Nick Johnson

1
Eu lhe dei +1 para uma boa resposta, e gostaria de dar outra para anular o voto negativo. Infelizmente, existem alguns bebês muito imaturos no mundo.
ProfK


0

Você pode verificar LicenseSpot . Ele fornece:

  • Componente de licenciamento gratuito
  • Ativação Online
  • API para integrar seu aplicativo e loja online
  • Geração de número de série
  • Revogar licenças
  • Gerenciamento de assinaturas

1
"Grátis" não é realmente grátis. É grátis incorporar o componente de licenciamento em seu aplicativo; não é gratuito para o aplicativo realmente usar o componente de licenciamento. Além de 10 ativações, você precisa pagar uma taxa mensal. Não é uma porcentagem por ativação. Para aplicativos .NET de baixo volume e baixo custo, esse modelo de preço será uma desvantagem. Não é como os aplicativos da Apple AppStore para .NET.
Cheeso de

0

Vou pegar carona na ótima resposta de @frankodwyer e me aprofundar um pouco mais no licenciamento online. Sou o fundador da Keygen , uma API REST de licenciamento desenvolvida para desenvolvedores.

Uma vez que você mencionou o desejo de 2 "tipos" de licenças para o seu aplicativo, ou seja, uma "versão completa" e uma "versão de teste", podemos simplificar isso e usar um modelo de licença de recurso onde você licencia recursos específicos do seu aplicativo (neste caso, há um conjunto de recursos "completo" e um conjunto de recursos de "teste").

Para começar, poderíamos criar 2 tipos de licença (chamados de políticas no Keygen) e sempre que um usuário registrar uma conta, você pode gerar uma licença de "teste" para ele começar (a licença "teste" implementa nossa política de recursos de "teste") , que você pode usar para fazer várias verificações dentro do aplicativo, por exemplo, o usuário pode usar Trial-Feature-A e Trial-Feature-B .

E, com base nisso, sempre que um usuário comprar seu aplicativo (seja usando PayPal, Stripe, etc.), você pode gerar uma licença implementando a política de recursos "completa" e associá-la à conta do usuário . Agora, em seu aplicativo, você pode verificar se o usuário tem uma licença "completa" que pode fazer Pro-Feature-X e Pro-Feature-Y (fazendo algo comouser.HasLicenseFor(FEATURE_POLICY_ID) ).

Mencionei permitir que seus usuários criem contas de usuário - o que quero dizer com isso? Eu falei sobre isso em detalhes em algumas outras respostas , mas um rápido resumo do motivo pelo qual acho que esta é uma maneira superior de autenticar e identificar seus usuários:

  1. As contas de usuário permitem que você associe várias licenças e várias máquinas a um único usuário , dando a você uma visão sobre o comportamento do seu cliente e solicitando "compras no aplicativo" ou seja, a compra de sua versão "completa" (como um aplicativo móvel).
  2. Não devemos exigir que nossos clientes insiram chaves de licença longas, que são entediantes de inserir e difíceis de controlar ou seja, se perdem facilmente. (Tente pesquisar "chave de licença perdida" no Twitter!)
  3. Os clientes estão acostumados a usar e-mail / senha ; Acho que devemos fazer o que as pessoas estão acostumadas a fazer para que possamos fornecer uma boa experiência do usuário (UX).

Claro, se você não quiser lidar com contas de usuário e quiser que seus usuários insiram as chaves de licença, tudo bem (e a Keygen também oferece suporte para fazer isso ). Estou apenas oferecendo outra maneira de lidar com esse aspecto do licenciamento e, com sorte, fornecer uma UX agradável para seus clientes.

Por fim, como você também mencionou que deseja atualizar essas licenças anualmente, pode definir uma duração em suas políticas para que as licenças "completas" expirem após um ano e as licenças de "teste" durem, digamos, 2 semanas, exigindo que seus usuários comprem um novo licença após a expiração.

Eu poderia me aprofundar mais, associando máquinas a usuários e coisas assim, mas pensei em tentar manter esta resposta curta e me concentrar em simplesmente licenciar recursos para seus usuários.


0

Verifique esta resposta: https://stackoverflow.com/a/38598174/1275924

A ideia é usar Cryptolens como servidor de licença. Aqui está um exemplo passo a passo (em C # e VB.NET). Também anexei um snippet de código para verificação de chave abaixo (em C #):

var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD";
var RSAPubKey = "{enter the RSA Public key here}";

var auth = "{access token with permission to access the activate method}";
var result = Key.Activate(token: auth, parameters: new ActivateModel()
{
    Key = licenseKey,
    ProductId = 3349,
    Sign = true,
    MachineCode = Helpers.GetMachineCode()
});

if (result == null || result.Result == ResultType.Error ||
    !result.LicenseKey.HasValidSignature(RSAPubKey).IsValid())
{
    // an error occurred or the key is invalid or it cannot be activated
    // (eg. the limit of activated devices was achieved)
    Console.WriteLine("The license does not work.");
}
else
{
    // everything went fine if we are here!
    Console.WriteLine("The license is valid!");
}

Console.ReadLine();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.