Если бы нужно было бы привязываться к оборудованию пользователя, я бы использовал бы идентификатор материнской платы UUID (в windows с помощью WMI в linux dmidecode)
Виртуальная машина конечно позволит скрыть аппаратный идентификатор и в общем случае нет способов добраться до реального железа, но можно ввести соответствующий запрет на это.
p.s. можно потребовать доступ к реальному GPU (в виртуальную машину его можно пробросить) там тоже есть UUID и LUID (вопрос исследования) эти данные наверняка можно получить даже с помощью браузера (это та еще песочница но gpu обычно дают доступ что бы видео крутилось)