Si no existe una necesidad real de seguridad, aquí hay un generador de números de serie muy rápido, con un comprobador:
- Usuario un contador. Inicialícelo en 0. Cuando desee un nuevo número de serie, incremente su contador en 1000; El nuevo valor del contador es el número de serie. El verificador funciona así: un número de serie es válido si termina con tres ceros. El verificador solo aceptará uno de cada 1000 números.
Si esta solución no le satisface, entonces sí necesita seguridad, y esto requiere criptografía.
La solución criptográficamente segura es tener números de serie firmados: el número de serie es la codificación de cierta carga útil (por ejemplo, un contador de todos los números de serie que usted ha generado) y una firma sobre la carga útil. El generador tiene una clave privada, que utiliza para calcular las firmas; El verificador solo conoce la clave pública correspondiente. El problema con esta configuración no es realmente acerca del tiempo de verificación, incluso en Javascript; más bien, es el tamaño de la firma lo que constituye un problema. Supongo que el número de serie será, en algún momento, escrito por un usuario. El tamaño teórico mínimo para una firma criptográficamente segura es de aproximadamente 80 bits (ya que las firmas se pueden verificar solo con la clave pública, un atacante podría probar todas las secuencias de bits posibles, y generalmente requerimos un nivel de seguridad de al menos 2 80 ). Sin embargo, las firmas más pequeñas entre los "supuestos esquemas seguros" están más cerca de 160 bits (con BLS , que utiliza un emparejamiento, que es un poco complejo de implementar) o 320 bits (con DSA o ECDSA ). Hay algunos trabajos sobre sistemas de firmas con firmas más cortas ( Quartz , o McEliece-Niederreiter ) pero existe bastante controversia sobre su seguridad.
Incluso con letras y dígitos en mayúsculas (36 caracteres posibles, y allí tiene 'I' y '1', y también 'O' y '0'), una firma de 160 bits utilizará 31 caracteres. Junto con la carga útil, terminará con números de serie de longitud 35 o más, lo que probablemente sea demasiado para que un usuario promedio escriba (pero no por un gran margen; una firma de 80 bits encajaría muy bien).
Si no usa un esquema de firma, debe tener en cuenta que un atacante razonablemente determinado podrá, mediante un desmontaje, eludir el comprobador o incluso aprender lo suficiente para poder para producir sus propios números de serie (que el verificador aceptará felizmente). En ese momento, no obtendrá seguridad cuantificada: no podrá decir: "mi plan es seguro hasta un presupuesto de 3.800 millones de dólares". Más bien, irá como: "mi plan es seguro hasta que aparece un estudiante suficientemente ingenioso y aburrido, realiza una ingeniería inversa del código del verificador y publica el resultado en Facebook".
El esquema clásico no muy seguro se vería así:
- Use el contador del esquema anterior (el que tiene extremos con tres ceros). Codifíquelo como un bloque de 64 bits. Cifre ese bloque con una clave simétrica codificada mediante un cifrado de bloque. El verificador conoce la clave y verifica el número de serie descifrando (con la misma clave simétrica codificada) y mirando los ceros finales.
Esto no es realmente más seguro que el contador simple, pero al menos los números de serie tendrán un aspecto aleatorio. Con un alfabeto de 34 caracteres (dígitos y letras mayúsculas excepto 'O' e 'I'), un bloque de 64 bits requiere 13 letras, lo que probablemente sea aceptable (un número de serie típico de Microsoft tiene 25 letras). Para el cifrado de bloque de 64 bits, recomiendo XTEA , que debería ser lo suficientemente rápido y sencillo de implementar.