Sven Rautenberg: 16 stelligen Code generieren

Beitrag lesen

Moin!

ich möchte gern einen 16 Stelligen code generieren lassen, der später zur Authentifizierung dienen soll.

Ich stelle mir das so vor es gibt eine Liste von codes, jemand kann davon einen erwerben und meldet sich dann mit diesem an.

Es sollte natrürlich kein Code zweimal vorkommen und es sollte nicht nach zu machen sein, wenn das geht.

Liste? Nix doppelt? Klingt so, als wolltest du zu einem einzigen Zeitpunkt eine beliebig lange Liste von Zufallswerten generieren und die dann so nach und nach aufbrauchen.

Warum nicht doppelt? Und was steckt hinter "zur Authentifizierung"?

Schön wäre das mit PHP.

Ich habe einige Erfahrungen mit dem Generieren von Codes, die zur Wiedererkennung bzw. zum Ausschließen von Mißbrauch genutzt werden.

Es gibt zwei Anwendungsfälle:

1. Der Code bleibt ausschließlich innerhalb elektronischer Systeme, wird also nie vom Menschen manuell wieder eingetippt. Dann muß man keine Anforderungen an eine maximale Länge des Codes stellen, und kann relativ sorglos den MD5- oder SHA1-Wert eines Strings verwenden, der aus Daten der Transaktion sowie einer Zufallskomponente generiert wird.

2. Wenn der Code von Menschen abgelesen und wiedereingetippt werden muß, sind strengere Anforderungen an die maximale Länge sowie an die genutzten Zeichen zu stellen.
a) Stolperfalle 1: Großschreibung vs. Kleinschreibung - funktioniert nie. Codes, die beides verwenden und dann auch noch auf korrekter Schreibweise bestehen, sind eklig. Nur mal angenommen, man kriegt so einen Code per Telefon übermittelt und muss ihn parallel eintippen: Eklig.
b) Stolperfalle 2: Uneindeutige Buchstaben und Zahlen - nerven extrem. Der Klassiker sind hier sicherlich 0 und O sowie 1 und l. Diese beiden Zeichen sollten verwechselt werden dürfen, d.h. der Code wird immer nur mit einem der beiden Zeichen generiert, und sollten die jeweils "anderen" Zeichen in der Benutzereingabe auftauchen, werden sie automatisch in die eigentlichen Zeichen gewandelt.

Solch einen menschenlesbaren Code erzeuge ich mir allerdings erstmal genauso, wie in Schritt 1: Die MD5-Summe eines Strings, der mit der jeweiligen Transaktion in Zusammenhang steht.

Damit diese Hex-Zahl in eine kürzere Hexzahl mit "größeren Zahlen" gewandelt wird, bietet PHP die Funktion base_convert() an.

  
$codezahl = base_convert(md5($string),16,36);  
$codezahl = str_replace(array('0','1'),array('l','o'),$codezahl);  

Der Code wird dann gespeichert (DB-Feld, wenn es wirklich einmalig sein soll, mit UNIQUE-Index), um später mit der User-Eingabe abgeglichen werden zu können. Wenn er nur 16 Zeichen lang sein soll, schneidet man ihn vor dem Speichern halt passend ab.

Alternativ kannst du natürlich auch einfach einen Zufallsstring zusammenbasteln. :)

- Sven Rautenberg

--
"Love your nation - respect the others."