Como são geradas as chaves de licença do software?

361

As chaves de licença são o padrão padrão como medida antipirataria. Para ser sincero, isso me parece uma (in) segurança através da obscuridade , embora eu realmente não tenha ideia de como as chaves de licença são geradas. Qual é um bom exemplo (seguro) de geração de chave de licença? Que primitivo criptográfico (se houver) eles estão usando? É um resumo da mensagem? Em caso afirmativo, quais dados eles estariam fazendo hash? Quais métodos os desenvolvedores empregam para dificultar a criação de crackers de seus próprios geradores de chaves? Como são gerados os principais geradores?

torre
fonte
8
+1 em uma pergunta interessante, talvez um respondente possa postar links para alguns bons recursos sobre este tópico para leitura adicional? por favor :)
Jacob
44
Todos os esquemas DRM são essencialmente esquemas de obscuridade, pois todo o código e dados necessários para a execução do programa foram fornecidos ao usuário. O esquema pode ser ofuscado arbitrariamente para dificultar o patch, mas é certo que o código pode ser corrigido para evitar qualquer verificação.
Caf
5
As chaves de CD são de fato segurança através da obscuridade. Existem várias maneiras de construí-las, mas todas necessariamente dependem da incorporação de algum segredo no programa necessário para verificar a chave.
Nick Johnson
4
Agora, elas são chamadas de chaves de produto ou chaves de licença , já que a maioria dos softwares que as utiliza é mais provável de serem entregues on-line do que em CD.
Joel Coehoorn
4
Eu gostaria de criar um aplicativo um dia em que tivesse que me preocupar com isso, tipo um sonho de infância. Os aplicativos da Web simplesmente não são suficientes.
Znarkus

Respostas:

268

Para chaves de CD da velha escola, era apenas uma questão de criar um algoritmo para o qual as chaves de CD (que poderiam ser qualquer sequência) são fáceis de gerar e fáceis de verificar, mas a proporção de chaves de CD válidas e CD inválidas -keys é tão pequeno que é improvável que você adivinhe aleatoriamente as chaves do CD para obter uma válida.

MANEIRA INCORRETA DE FAZER:

Starcraft e Half-life usaram a mesma soma de verificação, onde o 13º dígito verificou os 12 primeiros. Assim, você pode inserir qualquer coisa para os 12 primeiros dígitos e adivinhar o 13º (há apenas 10 possibilidades), levando ao infame1234-56789-1234

O algoritmo para verificação é público e é algo como isto:

x = 3;
for(int i = 0; i < 12; i++)
{
    x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;

MANEIRA CORRETA DE O FAZER

O Windows XP pega um pouco de informação, criptografa e coloca a codificação de letra / número em um adesivo. Isso permitiu à MS verificar sua chave e obter o tipo de produto (residencial, profissional etc.) ao mesmo tempo. Além disso, requer ativação online.
O algoritmo completo é bastante complexo, mas bem delineado neste documento (completamente legal!), Publicado na Alemanha.

Obviamente, não importa o que você faça, a menos que você ofereça um serviço on-line (como World of Warcraft ), qualquer tipo de proteção contra cópia é apenas um empate: infelizmente, se houver algum jogo que valha valor, alguém irá quebrar (ou pelo menos contornar ) o algoritmo da chave do CD e todas as outras proteções de direitos autorais.

Real maneira correta de fazê-lo:

Para serviços on-line, a vida é um pouco mais simples, pois mesmo com o arquivo binário, você precisa se autenticar com seus servidores para utilizá-lo (por exemplo, ter uma conta WoW). O algoritmo de chave de CD para World of Warcraft - usado, por exemplo, na compra de cartões de brincadeira - provavelmente se parece com isso:

  1. Gere um número aleatório criptograficamente seguro muito grande.
  2. Armazene-o em nosso banco de dados e imprima-o no cartão.

    Então, quando alguém digitar um número de cartão de reprodução, verifique se ele está no banco de dados e, se estiver, associe esse número ao usuário atual para que ele nunca possa ser usado novamente.

Para serviços online, não há razão para não usar o esquema acima; usar qualquer outra coisa pode levar a problemas .

BlueRaja - Danny Pflughoeft
fonte
47
O Mathematica tem um processo interessante. O produto vem com uma chave exclusiva e o arquivo de instalação gera uma segunda chave exclusiva (baseada no seu hardware). Ambas as chaves devem ser inseridas em um formulário on-line com seu nome e informações de registro e, em seguida, elas enviam a chave real com base nessas duas chaves que realmente desbloqueiam o software, mas apenas para essa chave específica do produto e seu hardware específico.
Dan
18
Hei, eu nunca soube da 1234-56789-1234tecla Starcraft, mas lembro que levou apenas cinco minutos para "forçar a força bruta" do verificador pressionando o teclado e tentando novamente.
F
18
Também me lembro de alguns produtos da Microsoft no passado permitindo que você use 111-1111111 como um cdkey válido (Visual Studio 6.0)
Hannson
25
Nunca soube sobre 1234-56789-1234. Em vez disso, usamos treze trios! 3333333333333
ErikTJ
33
O problema com a ativação on-line é que estamos todos ferrados se / quando o editor fechar o negócio. Por favor, não faça isso. Isso acontece e pode / acontecerá até para a Microsoft algum dia.
Brad
56

Quando escrevi originalmente esta resposta, pressupunha-se que a pergunta estava relacionada à validação 'offline' de chaves de licença. A maioria das outras respostas aborda a verificação on-line, que é significativamente mais fácil de manusear (a maior parte da lógica pode ser feita no servidor).

Com a verificação offline, o mais difícil é garantir que você possa gerar um grande número de chaves de licença exclusivas e ainda manter um algoritmo robusto que não é facilmente comprometido (como um dígito de verificação simples)

Não sou muito versado em matemática, mas me ocorreu que uma maneira de fazer isso é usar uma função matemática que plota um gráfico

A linha plotada pode ter (se você usar uma frequência suficientemente fina) milhares de pontos únicos, para que você possa gerar chaves escolhendo pontos aleatórios nesse gráfico e codificando os valores de alguma maneira

insira a descrição da imagem aqui

Como exemplo, plotaremos esse gráfico, escolheremos quatro pontos e codificaremos em uma string como "0, -500; 100, -300; 200, -100; 100,600"

Criptografaremos a string com uma chave conhecida e fixa (terrivelmente fraca, mas serve a um propósito), depois converteremos os bytes resultantes através do Base32 para gerar a chave final

O aplicativo pode reverter esse processo (base32 para número real, decodificar, decodificar os pontos) e depois verificar se cada um desses pontos está em nosso gráfico secreto.

É uma quantidade bastante pequena de código que permitiria a geração de um grande número de chaves únicas e válidas

No entanto, é muita segurança pela obscuridade. Qualquer pessoa que desmontasse o código seria capaz de encontrar a função gráfica e as chaves de criptografia e depois simular um gerador de chaves, mas provavelmente é bastante útil para diminuir a pirataria casual.

PaulG
fonte
6
Não, Erik não faria. X é um número inteiro e Y é o piso da função.
Joshua
Não é diferente da idade da navegação por satélite pré-GPS! youtube.com/watch?v=BBOsQBuCJfs
Brad
34

Verifique este artigo sobre Verificação Parcial de Chave, que cobre os seguintes requisitos:

  • As chaves de licença devem ser fáceis de digitar.

  • Devemos poder colocar na lista negra (revogar) uma chave de licença no caso de estornos ou compras com cartões de crédito roubados.

  • Não é necessário telefonar para casa para testar as teclas. Embora essa prática esteja se tornando cada vez mais predominante, eu ainda não a aprecio como usuário, por isso não pedirei que meus usuários a tolerem.

  • Não deve ser possível para um cracker desmontar nosso aplicativo liberado e produzir um "keygen" funcional a partir dele. Isso significa que nosso aplicativo não testará completamente uma chave para verificação. Apenas parte da chave deve ser testada. Além disso, cada versão do aplicativo deve testar uma parte diferente da chave, para que uma chave falsa baseada em uma versão anterior não funcione em uma versão posterior do nosso software.

  • Importante: não deve ser possível que um usuário legítimo digite acidentalmente uma chave inválida que parece funcionar, mas falha em uma versão futura devido a um erro tipográfico.

O Surricano
fonte
21

Eu não tenho nenhuma experiência com o que as pessoas realmente fazem para gerar chaves de CD, mas (supondo que você não queira seguir o caminho da ativação on-line), aqui estão algumas maneiras pelas quais alguém pode criar uma chave:

  • Exija que o número seja divisível por (digamos) 17. É trivial adivinhar, se você tiver acesso a muitas chaves, mas a maioria das cadeias possíveis será inválida. Semelhante seria exigir que a soma de verificação da chave corresponda a um valor conhecido.

  • Exija que a primeira metade da chave, quando concatenada com um valor conhecido, faça o hash até a segunda metade da chave. Melhor, mas o programa ainda contém todas as informações necessárias para gerar chaves e validá-las.

  • Gere chaves criptografando (com uma chave privada) um valor conhecido + nonce. Isso pode ser verificado descriptografando usando a chave pública correspondente e verificando o valor conhecido. O programa agora possui informações suficientes para verificar a chave sem poder gerar chaves.

Eles ainda estão todos abertos ao ataque: o programa ainda está lá e pode ser corrigido para contornar a verificação. Mais inteligente pode ser criptografar parte do programa usando o valor conhecido do meu terceiro método, em vez de armazenar o valor no programa. Dessa forma, você teria que encontrar uma cópia da chave antes de descriptografar o programa, mas ainda é vulnerável a ser copiado uma vez descriptografado e ter uma pessoa que faça sua cópia legítima e a use para permitir que todos acessem o software.

Andrew Aylett
fonte
9
Eu realmente gostaria que quem tinha vir para cima com o 'número usado uma vez' coisa não tivesse escolhido Nonce como o nome, dadas as ahem conotações negativas que me fazem rir cada vez que alguém sugere criptografar um.
Ed James
2
Observe que a terceira opção não funciona com códigos de chave simétricos, pois o invasor pode simplesmente reverter o teste no texto sem formatação, gerar algo que passa e depois criptografá-lo com a chave (conhecida) e o código (conhecido). Usar um código de fermentação caseiro não é uma solução, porque se você puder fazer isso sozinho, deverá conseguir um emprego na NSA.
BCS
@BCS: Desculpe, eu deveria ter sido mais claro sobre o uso de criptografia de chave pública.
Andrew Aylett
Use um esquema de assinatura, não um esquema de criptografia para a versão de chave pública. (A assinatura RSA se parece um pouco com "criptografia com a chave pública", mas não é totalmente a mesma coisa. Existem outros esquemas de assinatura que não possuem um esquema de criptografia associado, como o DSA.)
Paŭlo Ebermann
O problema com criptografia de chave pública é que as chaves (e, portanto, seriais) devem ser longas. Um par de chaves RSA de 512 bits não é difícil de resolver atualmente. Compare com as chaves do WinXP (5 grupos de 5 caracteres alfanuméricos) que têm apenas 128 bits de entropia, mas ainda uma dor de digitar.
finnw
17

As chaves de CD não são uma grande segurança para qualquer material que não esteja em rede; portanto, tecnicamente, elas não precisam ser geradas com segurança. Se você estiver no .net, quase poderá usar o Guid.NewGuid ().

Atualmente, seu principal uso é o componente Multiplayer, onde um servidor pode verificar a CD Key. Por isso, não é importante a segurança com que foi gerado, pois se resume a "Pesquise o que for passado e verifique se alguém já o está usando".

Dito isto, você pode usar um algoritmo para atingir dois objetivos:

  • Tenha uma soma de verificação de algum tipo. Isso permite que o instalador exiba a mensagem "A chave não parece válida", apenas para detectar erros de digitação (adicionar essa verificação ao instalador significa que escrever um gerador de chaves é trivial, pois o hacker possui todo o código de que precisa. verificar e confiar apenas na validação do servidor desabilita essa verificação, correndo o risco de incomodar seus clientes legais que não entendem por que o servidor não aceita sua chave de CD porque não tem conhecimento do erro de digitação)
  • Trabalhe com um subconjunto limitado de caracteres. Tentando digitar uma chave de CD e adivinhando "Este é um 8 ou um B? A 1 ou um I? Um Q ou um O ou um 0?" - usando um subconjunto de caracteres / dígitos não ambíguos, você elimina essa confusão.

Dito isto, você ainda deseja uma grande distribuição e alguma aleatoriedade para evitar um pirata, simplesmente adivinhando uma chave válida (que é válida no seu banco de dados, mas ainda dentro de uma caixa na prateleira da loja) e transando com um cliente legítimo que por acaso compra essa caixa .

Michael Stum
fonte
resolvido facilmente pelo bom atendimento ao cliente - Foto da caixa + Comprovante de compra = Bloquear usuário ilegal, conceder acesso ao segundo usuário.
Alexanderpas
11
aqui estão alguns pensamentos extras em chaves de CD codinghorror.com/blog/2007/12/software-registration-keys.html
Richard Chambers
10

Se você não está particularmente preocupado com o comprimento da chave, um método bastante experimentado e verdadeiro é o uso da criptografia de chave pública e privada.

Essencialmente, tenha algum tipo de nonce e uma assinatura fixa.

Por exemplo: 0001-123456789

Onde 0001 é seu noncece e 123456789 é sua assinatura fixa.

Em seguida, criptografe isso usando sua chave privada para obter sua chave de CD, algo como: ABCDEF9876543210

Em seguida, distribua a chave pública com seu aplicativo. A chave pública pode ser usada para descriptografar a chave do CD "ABCDEF9876543210", da qual você verifica a parte da assinatura fixa.

Isso impede que alguém adivinhe qual é a chave do CD para o nonce 0002, porque não possui a chave privada.

A única desvantagem importante é que suas chaves de CD serão bastante longas ao usar chaves privadas / públicas com tamanho de 1024 bits. Você também precisa escolher um número não longo o suficiente para não criptografar uma quantidade trivial de informações.

O lado positivo é que esse método funcionará sem "ativação" e você pode usar itens como endereço de e-mail ou nome do licenciado como nonce.

userx
fonte
11
Observe que meu exemplo subestima bastante o comprimento que sua chave teria. Esses esquemas geralmente exigem codificação base64 e implantação de copiar / colar, mas permitem chaves quase impossíveis de adivinhar que não estão vinculadas a uma máquina e não exigem ativação (duas coisas muito importantes para muitos tipos de clientes)
userx
3
Em vez de usar o RSA, você pode usar curvas elípticas. Eles usam teclas mais curtas e seu tamanho de bloco é menor. Lendo o Wiki, parece que uma de 256 bits ECC é tão segura como AES 128.
Xanatos
Observe que assinaturas digitais e "criptografia por chave privada" não são a mesma coisa. No RSA, eles parecem semelhantes (embora não sejam, devido a diferentes esquemas de preenchimento), outros esquemas de assinatura nem sequer têm um esquema de criptografia correspondente.
Paŭlo Ebermann
@xanatos, 256 bits ainda são muito longos para digitar manualmente. Considere as chaves de 25 caracteres usadas pelo WinXP - elas possuem apenas 128 bits de entropia.
finnw
11
@ Mark - Uma assinatura normalmente é apenas um hash criptografado. Você pode usar criptografia ou assinatura, meu método funciona da mesma maneira. Você está apenas tentando criar uma chave de licença que não pode ser gerada facilmente sem a chave privada e pode ser verificada pela chave pública. Pode ser a mensagem inteira criptografada (e você verifica se parte de seu conteúdo corresponde a algo mágico) ou simplesmente uma mensagem assinada (e você verifica se a assinatura é válida). Depende da sua implementação.
userx
9

O sistema de chaves deve ter várias propriedades:

  • muito poucas chaves devem ser válidas
  • chaves válidas não devem ser derivadas, mesmo considerando tudo o que o usuário possui.
  • uma chave válida em um sistema não é uma chave válida em outro.
  • outras

Uma solução que você deve fornecer a eles seria usar um esquema de assinatura de chave pública . Comece com um "hash do sistema" (digamos, pegue os macs em qualquer NICs, classificadas e as informações de ID da CPU, além de outras coisas, concatene tudo isso junto e obtenha um MD5 do resultado (você realmente não quer ser manipular informações de identificação pessoal, se você não precisar)) anexa o número de série do CD e se recusa a inicializar, a menos que alguma chave do registro (ou algum arquivo de dados) possua uma assinatura válida para o blob. O usuário ativa o programa enviando o blob para você e você devolve a assinatura.

Os problemas em potencial incluem o fato de você estar oferecendo praticamente qualquer coisa para que você assuma que alguém executará um texto sem formatação e / ou ataques de texto cifrado . Isso pode ser atenuado verificando o número de série fornecido e recusando-se a manipular solicitações de pessoas inválidas, além de recusar-se a manipular mais de um determinado número de consultas de um dado s / n em um intervalo (digamos 2 por ano)

Devo salientar algumas coisas: primeiro, um invasor habilidoso e determinado será capaz de contornar toda e qualquer segurança nas partes às quais eles têm acesso irrestrito ( ou seja, tudo no CD), o melhor que você pode fazer nessa conta é dificulta o acesso ilegítimo do que o acesso legítimo. Segundo, eu não sou especialista, portanto pode haver falhas sérias nesse esquema proposto.

BCS
fonte
1

Também existem comportamentos DRM que incorporam várias etapas ao processo. Um dos exemplos mais conhecidos é um dos métodos da Adobe para verificar uma instalação do Creative Suite. O método tradicional de CD Key discutido aqui é usado, então a linha de suporte da Adobe é chamada. A chave do CD é fornecida ao representante da Adobe e eles devolvem um número de ativação a ser usado pelo usuário.

No entanto, apesar de ser dividido em etapas, isso é vítima dos mesmos métodos de craqueamento usados ​​no processo normal. O processo usado para criar uma chave de ativação que é verificada em relação à chave do CD original foi rapidamente descoberto e foram gerados geradores que incorporam as duas chaves.

No entanto, esse método ainda existe como uma maneira de usuários sem conexão à Internet verificarem o produto. No futuro, é fácil ver como esses métodos seriam eliminados à medida que o acesso à Internet se tornar onipresente.

Sean
fonte
1

Todos os CD apenas algoritmos de proteção contra cópia incomodam usuários honestos, ao mesmo tempo em que não oferecem proteção contra pirataria.

O "pirata" só precisa ter acesso a um CD legítimo e seu código de acesso; ele pode fazer n cópias e distribuí-las.

Não importa o quão criptograficamente seguro você crie o código, você precisará fornecer o CD em texto sem formatação ou um usuário legítimo não poderá ativar o software.

Os esquemas mais seguros envolvem o usuário que fornece ao fornecedor do software alguns detalhes da máquina que executará o software (números de série da CPU, endereços Mac, endereço IP etc.) ou requerem acesso on-line para registrar o software no site do fornecedor e em troca, recebe um token de ativação. A primeira opção requer muita administração manual e vale a pena apenas para softwares de alto valor, a segunda opção pode ser falsificada e é absolutamente irritante se você tiver acesso limitado à rede ou estiver preso atrás de um firewall.

No geral, é muito mais fácil estabelecer uma relação de confiança com seus clientes!

James Anderson
fonte
0

Você pode usar e implementar a API de Licenciamento Seguro em ( https://www.nuget.org/packages/SystemSoulLicense/ ) com muita facilidade em seus Projetos de Software, (você precisa fazer o download do aplicativo da área de trabalho para criar uma licença segura em https: / /www.systemsoulsoftwares.com/ ) 1. Cria UID exclusivo para software cliente com base no hardware do sistema (CPU, placa-mãe, disco rígido) (o UID atua como chave privada para esse sistema único) 2. Permite enviar sequência de licença criptografada com muita facilidade para o sistema cliente, verifica a sequência de licença e funciona apenas nesse sistema específico 3. Esse método permite que desenvolvedores de software ou empresa armazenem mais informações sobre software / desenvolvedor / serviços de distribuidor / recursos / cliente 4. Ele fornece controle para bloquear e desbloquear os recursos de software cliente, economizando tempo dos desenvolvedores para criação de mais versões para o mesmo software, com alterações nos recursos 5. Ele também se preocupa com a versão de teste por vários dias 6. Ele protege o cronograma da licença verificando o DateTime on-line durante o registro 7. Desbloqueia todas as informações de hardware para os desenvolvedores 8.Possui todas as funções personalizadas e pré-compiladas que o desenvolvedor pode acessar a cada processo de licenciamento para criar código seguro mais complexo

Prashant Manjule
fonte