Como criar chave de série para proteger um aplicativo

Eu tenho um aplicativo que cria uma chave serial da seguinte maneira:

Take customername
Sign customername using privatekey and sha/dsa algorithm

Em seguida, a licença pode ser verificada por decodificação com chave pública e verificar as correspondências do cuastomername

Isso funciona bem, exceto que o serial gerado é bastante longo. Portanto, não é realmente prático para o cliente digitar a chave serial, em vez disso, eles precisam fornecer uma serial em um arquivo, o que é bastante diferente de como misturar aplicativos e trabalhar e é confuso.

Muitos outros aplicativos apenas fornecem ao usuário um Guid quando fazem uma compra

i.e. 5bd1060b-8608-4817-93ca-207f7c828e2f

e o usuário precisa inserir seu endereço de e-mail e guid para licenciar sua inscrição.

Isso parece uma solução mais simples para o usuário, mas não entendo como um aplicativo desse tipo verifica um guid válido a partir de um guid inválido, a menos que esteja tudo on-line verificando pares de email / guid em um banco de dados. Mas eu realmente gostaria que algum tipo de verificação fosse feito sem exigir um cheque online, caso contrário:

a> O aplicativo não funcionará se a conexão com a internet / meu servidor estiver inativa ou b> eles puderem contornar a verificação desativando o acesso à internet

EDITAR:

Minha solução de entendimento como proposta pela resposta abaixo:

Usuário faz compra
Tome emailaddress + sal
Criptografar com SHA1 dá hash de 160 bits
Converter para notação hexadecimal fornece 20 valores hexadecimais, ou seja, 40 caracteres
Lop dos últimos 8 caracteres para dar um Guid
E-mail Gui do usuário e endereço de e-mail que eles entram no Programa O programa verifica esse pareamento, obtendo o endereço de e-mail, adicionando salt, criptografando o ectera e a verificação gera um guid válido.

Meu principal problema com isso é que eu preciso armazenar o sal no programa em algum lugar, portanto, se o hacker encontrar o código e descobrir o que estou fazendo, ele poderá criar um gerador de chave de licença válido para qualquer endereço de email.

Meu método atual para outro programa:

Eu gerou um par chave pública / chave privada
Usuário faz compra
Eu gero uma licença assinando o endereço de email
BaseEncode a licença gerada
Enviar licença para o usuário
Programa verifica licença por codificação e decodificação com chave pública

Meu problema é que quando eu assino o endereço de e-mail é muito longo, então acabo colocando-o em um arquivo em vez do usuário digitá-lo em um campo, mas talvez o problema seja que estou baseando em vez de converter em Hex.

Por quanto tempo a saída de assinatura pode ser, depende do tamanho da entrada ou é sempre a mesma?

Porque eu descriptografar a chave com a chave pública Eu não posso cortar alguns caracteres da chave de licença, mas se a chave gerar é de apenas 40 caracteres, eu acho que está tudo bem

Acho que a vantagem desse método é que, mesmo que o hacker resolva como eu estou fazendo as coisas, eles não podem criar um gerador de licenças porque eles não fazem isso, e não podem obter a chave privada porque ela é armazenada apenas no meu servidor. Eles só poderiam gerar licenças se criassem um novo pareamento de chave privada / pública e, em seguida, se meu aplicativo tivesse a chave pública codificada em si, o aplicativo poderia rejeitar a licença de qualquer maneira.

É claro que eles poderiam hackear o aplicativo, mas se o aplicativo fosse atualizado regularmente, isso se tornaria um grande esforço.

Então, em resumo: Entendi isso corretamente, qual método é melhor e quantos dados são gerados para a segunda abordagem.

questionAnswers(2)

yourAnswerToTheQuestion