Ein asymmetrisches Kryptoverfahren wie z.B. RSA ist gut für Aktivierungsschlüssel geeignet. Dabei enthält die Software den Public Key des Softwareherstellers. Im ersten Schritt erzeugt die Software auf Basis von lokalen Informationen einen Registrierungsschlüssel. Dieser kann z.B. folgende Information enthalten:
- Name des Benutzers/Firma und weitere persönliche Information
- MAC oder IP Adressen zur Identifizierung des PCs
- Zufallszahl zur Identifizierung einer Installation der Software
- Systemresourcen (z.B. je nach Lizenzmodell Anzahl der Prozessoren etc.)
Dieser Registrierungsschlüssel wird dann zum Softwarehersteller übertragen. Dabei kann optional eine Hashfunktion eingesetzt werden, um die Datenmenge so gering zu halten, dass man sie auch per Telefon weitergeben kann. Der Softwarehersteller prüft die Daten (sofern ungehashed) und die Bestellung/Bezahlung des Kunden und erstellt dann für den gelieferten Registrierungsschlüssel mit seinem Private Key einen Aktivierungsschlüssel.
Der Aktivierungsschlüssel kann innerhalb der Software mit dem Public Key entschlüsselt werden und gegen die lokalen Daten geprüft werden, z.B. ein Vergleich der IP Adressen.
Sowohl Registrierungsschlüssel als auch Aktivierungsschlüssel werden häufig durch Hashfunktionen verkürzt, kodiert und in Blöcken für leichtere Lesbarkeit ausgegeben, wobei die folgenden Zeichen verwendet werden: A B C D E F G H J K L M N P Q R S T W X Y Z 3 4 7 9
Vorteilhaft an diesem Verfahren ist, dass der zurückgelieferte Aktivierungsschlüssel auch zusätzliche Information enthalten kann wie z.B. zu aktivierende Module oder Zeitstempel für Evaluierungszeiträume, die dann von der Software geprüft und/oder angezeigt werden können.
Häufig werden Lizenzdateien verwendet, welche die freizuschaltenden Produktfeatures im Klartext enthält und digital Signiert ist. Diese kann man zwar nicht mehr so leicht per Telefon oder Fax versenden, haben dafür aber den Vorteil dass sie einfacher zu verstehen und zu warten sind. Diese werden bei der Bestellung/Bezahlung gleich mitgeneriert. Der Nachteil ist allerdings, dass diese dann nicht an später gelieferte Information gebunden ist, wie z.B. eine einmalige Ziffer pro Installation oder MAC-Adresse der Netzwerkkarte.
Edit:
Für verkürzte Aktivierungskeys kann eine einfache Zufallszahl eingesetzt werden:
public byte[] generateRegistrationKey() {
// Zufälliger Seed pro Installation
long number = random.nextLong() + Integer.MAX_VALUE;
BigInteger big = BigInteger.valueOf(number);
// Mehr Information in Zufallszahl kodieren
if (Runtime.getRuntime().availableProcessors() == 1) {
big = big.clearBit(CPU_MULTI_CORE);
} else {
big = big.setBit(CPU_MULTI_CORE);
}
// In lesbare Form konvertieren:
String raw = big.toString(Character.MAX_RADIX);
System.out.println("Aktivierungskey: " + raw);
// Beispiel: "Aktivierungskey: mkmslufz31kb"
return raw.getBytes();
}