Es una buena apuesta que cada compañía tenga su propia forma de hacerlo. Edgar Chris ha sugerido un algoritmo anclado por el usuario, pero para los códigos genéricos transferibles (por ejemplo, códigos de tarjetas de regalo de iTunes), puede mantener un contador en serie para cada tipo de regalo por separado (por ejemplo, tarjetas de regalo de $ 10 frente a $ 50), luego use el siguiente algoritmo:
- Genere el siguiente número de serie N.
- Genere una sal S que se base en el código de tipo de regalo C (por ejemplo, siembre su PRNG favorito con C , luego use el noveno número generado como S ).
- Calcule un hash H del par (N, S).
- Base36-encode (C, N, H) para obtener su código de regalo. Probablemente quiera quitar los bits de alto orden de C y N no utilizados para compactar el código tanto como sea posible.
El algoritmo de verificación se deja como ejercicio para el lector.
ACTUALIZACIÓN: Gracias a Jeffrey Goldberg por recordarme que un Código de autenticación de mensajes como HMAC tiene un mejor propósito que un simple hash en el paso 3, y la mayor complejidad computacional es trivial e irrelevante para este caso de uso. El uso de un MAC también hace innecesaria la generación de sal, por lo que mi algoritmo revisado sería:
- ¿Publicar el código fuente de un sitio web genera vulnerabilidad de seguridad? En caso afirmativo, ¿por qué?
- ¿Puedo tener una lista de hackers falsos?
- ¿Cuál tendrá más alcance en el futuro: seguridad de la red, seguridad de la aplicación o seguridad de la información?
- ¿Debo renovar mi suscripción de antivirus Norton o hay una mejor protección para mis computadoras?
- ¿Cuál es la mejor contraseña para usar?
- Genere el siguiente número de serie N.
- Calcule un HMAC H del par (N, C).
- Base36-encode (C, N, H) para obtener su código de regalo. Probablemente quiera quitar los bits de alto orden de C y N no utilizados para compactar el código tanto como sea posible.