Cómo crear claves de publicaciones seriadas para proteger una aplicación.

Tengo una aplicación que crea una clave de serie de la siguiente manera:

Take customername
Sign customername using privatekey and sha/dsa algorithm

Luego se puede verificar la licencia decodificando con una clave pública y verificando las coincidencias de cuastomername

Esto funciona bien, excepto que la serie generada es bastante larga. Por lo tanto, no es realmente práctico para el cliente escribir la clave de serie, sino que tienen que proporcionar una serie en un archivo, que es bastante diferente de cómo funcionan las aplicaciones de niebla y es confuso.

Muchas otras aplicaciones solo le proporcionan al usuario un Guid cuando realizan una compra

es decir, 5bd1060b-8608-4817-93ca-207f7c828e2f

y el usuario debe ingresar su dirección de correo electrónico y guid para licenciar su aplicación.

Esto parece una solución más clara para el usuario, pero no entiendo cómo una aplicación de este tipo verifica una guía válida de una guía no válida a menos que se haga en línea al revisar los pares emailaddress / guid en una base de datos. Pero realmente me gustaría que se realizara algún tipo de verificación sin requerir un cheque en línea de lo contrario:

a> La aplicación no funcionará si la conexión a Internet / mi servidor está inactivo o b> pueden eludir la comprobación deshabilitando el acceso a Internet

EDITAR:

Mi solución de comprensión según lo propuesto por la respuesta a continuación:

El usuario hace la compra
Tomar emailaddress + sal
Cifrar con SHA1 da un hash de 160 bits
Convertir a notación hexadecimal da 20 valores hexadecimales, es decir, 40 caracteres
Lop de los últimos 8 personajes para dar un guid.
La Gui del usuario de correo electrónico y la dirección de correo electrónico que ingresan en el programa El programa verifica este emparejamiento al tomar la dirección de correo electrónico, agregar sal, cifrar ectera y verificar genera un guid válido.

Mi principal problema con esto es que necesito almacenar la sal en el programa en algún lugar, por lo tanto, si el pirata informático encuentra la sal y averigua qué estoy haciendo, puede crear un generador de clave de licencia válido para cualquier dirección de correo electrónico.

Mi método actual para otro programa:

He generado un par de clave pública / clave privada
El usuario hace la compra
Yo genero una licencia al firmar el emailaddress
BaseEncode la licencia generada
Enviar licencia al usuario
El programa verifica la licencia basándose en la codificación y el descifrado con clave pública

Mi problema ha sido que cuando firmo la dirección emaila es demasiado larga, por lo que termino de ponerla en un archivo en lugar de que el usuario la ingrese en un campo, pero tal vez el problema es que estoy codificado en base en lugar de convertir a Hex.

¿Por cuánto tiempo puede ser la salida de la firma, depende de la longitud de la entrada o es siempre la misma?

Como descifro la clave con la clave pública, no puedo copiar algunos caracteres de la clave de licencia, pero si la clave de generación es de solo 40 caracteres, creo que está bien.

Creo que la ventaja de este método es que incluso si el pirata informático resuelve cómo estoy haciendo las cosas, no pueden crear un generador de licencias porque no lo hacen, y no pueden obtener la clave privada porque solo está almacenada en mi servidor. Solo podrían generar licencias si crearon un nuevo emparejamiento de clave pública / privada y luego, si mi aplicación tenía la clave pública codificada en sí misma, la aplicación podría rechazar la licencia de todos modos.

Por supuesto, podrían piratear la aplicación, pero si la aplicación se actualizaba regularmente, se convertiría en un gran esfuerzo.

Así que en resumen: He entendido esto correctamente, cuál es el mejor método y cuántos datos se generan para el segundo enfoque.

Respuestas a la pregunta(2)

Su respuesta a la pregunta