Wie erstelle ich "Product Keys" in PHP?

... komplette Frage anzeigen

3 Antworten

Nun das kannst doch du bestimmen, wenn du den Key erstellst. Denk dir einfach irgendeine Regel aus. Bei lediglich 2 Produkten könnte man z.B. ein paar Stellen innerhalb des Keys überprüfen, die Stelle des Buchstaben im Alphabet oder ASCII ermitteln und überprüfen ob diese eine ungerade Zahl ergibt (Produkt A) oder eine gerade (Produkt B).

Das würde mir spontan einfallen aber Möglichkeiten gibt es da unendlich viele, das ist wie gesagt deine Entscheidung.

Antwort bewerten Vielen Dank für Deine Bewertung

Wie apachy schon gesagt hat gibt es unendlich viele Möglichkeiten wie du deinen Key generieren kannst.

Ich geb dir mal ein Beispiel:

XXXX-YYYYYYYY-ZZZZ

  • X: Random-Key
  • Y: Datum (XOR mit X)
  • Z: Teil eines Hashs von Produktnamen+Y

Der Random-Teil bringt Variation in den Key. Der Random-Key wird dann mit dem aktuellen Datum (Timestamp) Exklusiv-Oder verknüpft. Vorteil davon ist, dass man durch erneutes Anwenden der Verknüpfung die "Verschlüsselung" rückgängig machen kann um wieder an das Datum zu gelangen. Im letzten Teil kommt der Produkt-spezifische Teil: Der Name des Produkts und der verschlüsselte Y-Teil aneinandergehängt wird gehasht und dann die ersten paar Zeichen davon verwendet.

Was bringt das?

  • Der Key sieht zufällig aus. Auf den ersten Blick sehen verschiedene Keys für das gleiche Produkt unterschiedlich aus, da der Random-Anteil überall einfließt
  • Du hast eine Kennung für dein Produkt drinne und kannst unterscheiden ob es zu Produkt A oder B gehört
  • Du kannst durch einbauen der Hauptversionsnummer in den Produktnamen die Lizenz auf eine Hauptversionsnummer beschränken (Dein Key gilt nur für Produkt A in Versionsnummer 2 z.B.)
  • Du kannst das Generierungsdatum des Keys rausrechnen. Nützlich, wenn du planst eine zeitliche Nutzungsbeschränkung einzubauen. Du kannst beim Start des Programms das Datum aus dem Key rausrechnen, deine Gültigkeitsdauer draufrechnen und mit dem aktuellen Datum vergleichen
  • Du hast einen eingebauten Bitfehler-Check: Wenn auch nur 1 Bit im Key nicht stimmt lässt sich im Z-Teil das Produkt nicht erkennen und dein Key ist ungültig

Hier eine einfache Implementierung des ganzen:

<?php 

function generate_key($productname)
{
    $x = substr(sha1(uniqid ( '' )),0,4);
    $y = dechex(intval(microtime(true)) ^ hexdec(str_repeat($x,2)));
    $z = substr(sha1($productname.$y),0,4);

    return strtoupper("$x-$y-$z");
}

$p = generate_key("Produkt A");
echo $p;

function extract_key_date($key, $productname)
{
    $xyz = explode("-",strtolower($key));
    if(count($xyz)!=3 || empty($productname))
        return false;

    $y = hexdec($xyz[1]) ^ hexdec(str_repeat($xyz[0],2));

    return strcmp(substr(sha1($productname.$xyz[1]),0,4),$xyz[2])==0 ? $y : false;
}

var_dump(date("d-m-Y H:i:s",extract_key_date($p,"Produkt A")));

?>

Du rufst generate_key auf und übergibst ein für das Produkt eindeutigen Identifier (z.B. den Produktnamen) und erhälst deinen Key. Den speicherst du in deine DB.

Mit der zweiten Funktion kannst du dir das Generierungsdatum des Keys rausziehen. Wenn das nicht funktioniert (also false zurückkommt) kann der Key definitiv nicht stimmen. Entweder gabs ein Tipp-Fehler im Key oder es ist kein Key für das angegebene Produkt. Die Funktion kannst du in dein Produkt einbauen, solltest du die Notwendigkeit für eine Zeitbeschränkung haben.

Das ganze ist eine recht simple Variante. Der Fantasie sind keine Grenzen gesetzt...

Antwort bewerten Vielen Dank für Deine Bewertung

ChrisBoy19 01.12.2013, 19:04

Wow, hast du das extra für mich geschrieben? Vielen dank dafür! Werde den Code erweitern und gegebenfalls anpassen. Und natürlich vielen dank für die ganzen Erklärungen, hast dir den Stern mehr als verdient :))

0
ChrisBoy19 01.12.2013, 19:13
@ChrisBoy19

Also jetzt mal im ernst, sowas kannst du mir nicht einfach Programmieren. Das ist ja einfach nur "Wow"...Alles was ich haben wollte. Ich werde mir nochmal genau durchlesen wie das ganze funktioniert, scheint für meine Kenntnisse doch ein wenig Komplex zu sein. Aber werde es auf jeden fall verwenden :)) Danke!

0

Also einen sehr langen key aber gut sicherer ist eine uniqid in md5 verschlüsselt. Der Code würde wie folgt aussehen:

md5 ( uniqid ( '' )

Rauskommen würde in etwas sowas: d9b3fe674303124257b0af086fac4325

Zum Ablauf. Uniqid erstellt einen Zufälligen Code. Md5 verschlüsselt diesen dann.

Zum Code kannst du dann ja noch einen eigenen Code hinzufügen der halt nur für Produkt A ist. Also zum Beispiel:

ProduktAkey-d9b3fe674303124257b0af086fac4325

oder sowas.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?