Самый современный метод - это активация по сети. Дело в том, что это удобно. То есть если у вас уникальный софт, и аналогов ему нет, то можете издеваться над пользователем, как хотите. Но если покупка у конкурентов проще, то вы просто потеряете клиентов.
В частности, довольно надежный способ защиты, когда работа приложения возможна только в онлайне. Оно осуществляет подсоединение к вашему серверу, который не позволяет запускать другие копии софта с тем же ключом. Из минусов - надо держать свой сервер и четко следить за его работой. Из плюсов - пользователь получает гибкость в плане переноса софта на другие машины. Такой подход меняет соответственно и оплату - услуга становится подпиской, а софт сдается в аренду.
Ну а если у пользователей нет Интернета, то берите не современные методы, а проверенные старые. Но в современном мире это практически невозможно. Так что, как минимум, одноразовую онлайн-активацию пользователь должен суметь пройти. Соответственно, здесь подход примерно такой же - у пользователя должен быть личный кабинет, связанный с купленным софтом. В этом ЛК он управляет своими ключами. В частности, он может отвязывать свои ключи от старого (возможно, утраченного) железа. Но здесь и проблема - если софт не может проверить свой статус по сети, то он и не узнает о том, что произошла отвязка. Поэтому время от времени софт всё равно должен стучаться в Интернет. Вот дальше начинаются тонкости, как часто, где это хранить и шифровать надежней, как определить текущее время и т.д. Для простоты можно не заморачиваться и заставлять пользователя быть онлайн, хотя бы чисто для запуска приложения.
А если приложение простое, которое конкуренты могут слепить за месяц, то здесь важно, извиняюсь, не защищать приложение вообще. Его наверняка спиратят, если оно хорошее, но это только на пользу идёт, реклама, и его больше будут покупать. Опять же, смотря какие цены, но на простое приложение цена должна быть копеечной, а основной упор на массовость продаж в купе с микроскопической себестоимостью.