Esto es para un proyecto de juego de Android (a través de Cordova / Phonegap). Mi objetivo es poder proporcionar un "código de promoción" que permita a cualquiera desbloquear el juego de forma gratuita, pero quiero limitar cada código para que funcione solo por un día y no quiero confiar en un componente del lado del servidor Para validar los códigos. La solución que se me ocurrió fue que el código de cada día fueran las primeras letras del hash md5 de (el código del día anterior + un valor secreto). Aquí está en js:
function checkPromoCode(codeToCheck) {
var secretString = "ABCDEFGH";
var startDate = new Date(1388534400000); // Jan 1 2014
var currentDate = new Date();
var todaysCode = "";
while (startDate < currentDate) {
todaysCode = md5(todaysCode + secretString).substring(0,6);
startDate.setDate(startDate.getDate() + 1);
}
if (codeToCheck == todaysCode) return true;
return false;
}
¿Estoy en lo cierto al pensar que la única manera razonable para que un atacante (quién sabe el algoritmo que estoy usando y los códigos de algunos días anteriores) para determinar el código de hoy sea determinando el valor de secretString? Entiendo que un atacante determinado podría averiguar el valor de las cadenas secretas por fuerza bruta o por análisis de la apk. Nada es irrazonable; El objetivo aquí es hacer que sea razonablemente difícil. ¿Me falta algo obvio? ¿Y es MD5 un hash apropiado para usar?