Ein recht einfacher und relativ sicherer Weg ist das du alle Kundenrelevanten Daten irgendwo abspeicherst. Also zum Beispiel Kundennummer, Name oder was du brauchst um den Kunden eindeutig zu identifizieren. Dazu kannst du dann noch andere Datenspeichern wie zum Beispiel die Version die der Kunde gekauft hat (Vollversion, eingeschränkte Version usw) wenn es sowas gibt. Außerdem speicherst du dazu noch den signierten Hash all dieser Daten.
Diesen Hash hast du mit deinem private Key signiert den nur du hast. Das Programm liest dann wenn es startet all diese Daten ein und erstellt selber einen Hash mit dem passenden public Key den es dazu hat und prüft ob die beiden Hashes zueinander passen. Wenn ja ist alles ok und wenn nicht hat jemand was an den Daten geändert.
Du musst dann nur noch sicherstellen das ein Kunde auch seine Lizenzdatei verwenden muss und nicht einfach die eines anderen nehmen kann.
In .Net kannst du das zum BEispiel mit dem RSACryptoServiceProvider machen.