Questo è per un progetto di gioco Android (via Cordova / PhoneGap). Il mio obiettivo è essere in grado di fornire un "codice promozionale" che permetterà a chiunque di sbloccare il gioco gratuitamente, ma voglio limitare ogni codice a funzionare solo per un giorno e non voglio fare affidamento su un componente lato server per convalidare i codici. La soluzione che ho trovato era che il codice di ogni giorno fosse le prime lettere dell'hash md5 del (codice del giorno precedente + un valore segreto). Eccolo in 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;
}
Ho ragione nel ritenere che l'unico modo ragionevole per un utente malintenzionato (che conosce l'algoritmo che sto usando e conosca i codici di alcuni giorni precedenti) per determinare il codice di oggi consiste nel calcolare il valore di secretString? Capisco che un determinato attaccante potrebbe capire il valore di secretString con la forza bruta o con l'analisi dell'apk. Niente è irricevibile; l'obiettivo qui è solo quello di renderlo ragionevolmente difficile. Mi manca qualcosa di ovvio? E MD5 è un hash appropriato da usare?