Sin hardware adicional, no hay forma de hacer esto que no sea evitable. Es el problema de DRM.
Podría usar hardware que tenga la clave para generar el MAC. Es una propuesta costosa, pero puede valer la pena si el contenido / IP es suficientemente valioso.
Sin hardware adicional, la clave de cifrado generalmente se puede mover y la información sobre el dispositivo se puede falsificar. Puede haber plataformas donde la clave se pueda bloquear (TPM, cryptochip), pero ¿cómo confía en la información que el dispositivo comparte sobre esta clave? Siempre puede forjar la clave en la zona de usuario mediante la manipulación de su programa. Incluso si proporciona la clave, tiene que pasar por el territorio del usuario antes de llegar a TPM o crytochip y puede ser interceptado y robado allí.
La mejor solución sin hardware que se me ocurra es incluir información de la máquina en el MAC y tener verificaciones del lado del servidor para varios clientes. La información de la máquina es falsificable: alguien que depure su aplicación podrá aprender qué factores está utilizando y poner ganchos en los valores que espera, por lo que es insuficiente.
Si dos o más direcciones de IP están realizando solicitudes simultáneas, entonces tiene alguna indicación de que el usuario está en roaming o está violando su límite de dispositivo único. Tener cierta heurística durante un período de gracia en múltiples IP equilibraría eso y limitaría el riesgo de bloquear un dispositivo legítimo.
Los usuarios seguirán pudiendo usar múltiples dispositivos si piratean el modo cliente, pero no podrán usarlos simultáneamente, lo que creo que es una restricción más significativa en la práctica.