Non c'è modo senza hardware aggiuntivo per fare ciò che non è elusivo. È il problema del DRM.
Potresti usare l'hardware che ha la chiave per generare il MAC. Questa è una proposta costosa, ma potrebbe valerne la pena se il contenuto / IP è sufficientemente prezioso.
Senza hardware aggiuntivo, la chiave di crittografia può essere spostata e le informazioni sul dispositivo possono essere modificate. Potrebbero esserci piattaforme in cui la chiave può essere bloccata (TPM, cryptochip), ma come ti fidi delle informazioni che il dispositivo condivide su questa chiave? Può sempre forgiare la chiave in userland manipolando il tuo programma. Anche se fornisci la chiave deve passare attraverso l'utente prima di arrivare al TPM o al Crytochip e può essere intercettato e rubato lì.
La soluzione migliore senza hardware a cui riesco a pensare è quella di includere le informazioni della macchina nel MAC e di avere controlli lato server per più client. Le informazioni sulla macchina sono perdonabili: qualcuno che esegue il debug della tua app sarà in grado di apprendere quali fattori stai utilizzando e di inserire degli hook che forgiano i valori che ti aspetti, quindi è insufficiente.
Se due o più indirizzi IP stanno facendo richieste simultanee, allora hai qualche indicazione che l'utente sta vagando o sta violando il limite del tuo singolo dispositivo. Avere un certo heurisic per un periodo di grazia su più IP equivale a bilanciare questo e limitare il rischio di bloccare un dispositivo legittimo.
Gli utenti saranno comunque in grado di utilizzare più dispositivi se hackeranno il tuo client-sode, ma non saranno in grado di usarli contemporaneamente, il che credo sia una restrizione più significativa nella pratica.