16 stelligen Code generieren
bernd
- php
Hallo,
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.
Schön wäre das mit PHP.
mfg bernd
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.
md5 und sha1 sind eigentlich die Digests, die praktisch überall verfügbar sind, also auch in PHP.
Es sind Checksummen, die genau für Identifikationen oder mit grösster wahrscheinlichkeit einzigartige Ids geeignet sind.
Schön wäre das mit PHP.
Schaust du im PHP Handbuch unter dem Stichwort md5 oder sha1.
mfg Beat
Hi,
o.k. werde mir das mal genauer angucken.
Danke.
mfg bernd
Hi,
ok genauer ausgedrückt möchte ich einen 16 stelligen hexadezimalcode als Ergebnis haben.
md5 liefert 32 stellige codes.
Im weiteren würde ich gerne codes ohne vorlage generieren.
Also ohne ein Wort davor auszuwählen was in code umgewandelt werden soll.
mfg bernd
Hello,
dann hilft Dir vielleicht diese Funktion:
define("ZEICHENSATZ","abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ0123456789-+_&~.,!");
function get_random_str($lenmin,$lenmax)
{
mt_srand ((double)microtime()*1000000);
$anzahl = mt_rand($lenmin,$lenmax);
$zeichen=ZEICHENSATZ;
$zufall="";
$i=0;
while($i<=$anzahl)
{
$zufall.=substr($zeichen,mt_rand(0,strlen($zeichen)),1);
$i++;
}
return $zufall;
}
Wenn Du Fragen dazu hast, dann frag :-)
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Wenn Du Fragen dazu hast, dann frag :-)
Ich hab eine. Welchen tieferen Sinn hat es, erst eine Konstante zu definieren und diese dann in eine Variable zu laden?
Hello,
Wenn Du Fragen dazu hast, dann frag :-)
Ich hab eine. Welchen tieferen Sinn hat es, erst eine Konstante zu definieren und diese dann in eine Variable zu laden?
Hast Recht, das ist hier überflüssig.
Ich hatt es nur eben schnell aus meinen Uraltscripten rausgekramt.
Man kann das entsprechend kürzen, wobei ich immer gerne lesbaren Code nutze und keinen kryptischen, falls jetzt jemand auf die Idee kommen sollte, das alles in eine zeile zu pressen :-)
<?php ### random_str.php ###
define("ZEICHENSATZ","abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ0123456789-+_&~.,!");
function get_random_str($lenmin,$lenmax)
{
mt_srand ((double)microtime()*1000000);
$anzahl = mt_rand($lenmin,$lenmax);
$zufall="";
$i=0;
while($i<=$anzahl)
{
$zufall.=substr(ZEICHENSATZ,mt_rand(0,strlen(ZEICHENSATZ)),1);
$i++;
}
return $zufall;
}
$data .= get_random_str(10,20);
echo htmlspecialchars($data);
?>
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hi,
ich versuch es mal zu kommentieren.
define("ZEICHENSATZ","abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ0123456789-+_&~.,!");
// hier werden die möglichen Zeichen festgelegt.
$lenmin = '0';
$lenmax = '10';// höchster und niedrigster Wert.
function get_random_str($lenmin,$lenmax)
{
mt_srand ((double)microtime()*1000000);
$anzahl = mt_rand($lenmin,$lenmax); // versteh ich nich ganz wieso hier mt_rand wenn es nur als Anzahl der codes dient. Wenn ich das richtig verstehe.$zeichen=ZEICHENSATZ; // der soll wohl in Form einer Variable hier zugeführt werden ?
$zufall="";
$i=0;
while($i<=$anzahl)
{
$zufall.=substr($zeichen,mt_rand(0,strlen($zeichen)),1);hier wird wohl die Zahl generiert.
$i++;
}
return $zufall;
}
soweit meine Fragen
mfg bernd
Hello,
ich versuch es mal zu kommentieren.
Ja, gut.
define("ZEICHENSATZ","abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ0123456789-+_&~.,!");
// hier werden die möglichen Zeichen festgelegt.
stimmt. Die könntest Du z.B. auf a-f und 0-9 beschränken.
$lenmin = '0';
$lenmax = '10';// höchster und niedrigster Wert.
Einen Code mit 0 Zeichen Länge würdest Du aber nicht haben wollen.
Für Deine Zwecke, wenn die Länge immer 16 Zeichen sein soll, müsste da (16,16) stehen.
function get_random_str($lenmin,$lenmax)
{
mt_srand ((double)microtime()*1000000);
$anzahl = mt_rand($lenmin,$lenmax); // versteh ich nich ganz wieso hier mt_rand wenn es nur als Anzahl der codes dient. Wenn ich das richtig verstehe.$zeichen=ZEICHENSATZ; // der soll wohl in Form einer Variable hier zugeführt werden ?
sollte...
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hallo,
$i=0;
while($i<=$anzahl)
{
$zufall.=substr($zeichen,mt_rand(0,strlen($zeichen)),1);
$i++;
}
Wenn Du Fragen dazu hast, dann frag :-)
Ich hab auch eine: Warum nicht gleich eine for-Schleife?
MfG
Hello,
Ich hab auch eine: Warum nicht gleich eine for-Schleife?
Wo Du recht hast...
Nur zu. Das Beispiel ist ja zum Diskutieren da :-)
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
md5 liefert 32 stellige codes.
Könnte man auf 16 Stellen abschneiden
Im weiteren würde ich gerne codes ohne vorlage generieren.
Wieso verwendest du als "Vorlage" nicht einfach du Unix-Timestamp? Dann hast du bei jedem Aufruf einen einmaligen Wert. Ich gehe jetzt mal davon aus, dass sich nicht mehrere Personen in der gleichen Millisekunde bei dir anmelden.
Hello,
Wieso verwendest du als "Vorlage" nicht einfach du Unix-Timestamp?
Das ist dann aber kein Zugangscode sondern eine Sicherheitslücke!
Sowas sollte man von nachvollziehbaren Einstiegsgrößen möglichst unabhängig halten.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Sowas sollte man von nachvollziehbaren Einstiegsgrößen möglichst unabhängig halten.
Sobald ich die mit einer Zeichenkette verknüpfe, die unbekannt ist, hat sich was mit Sicherheitslücke.
Ausserdem geh ich davon aus, wenn der OP diese Codes "verkaufen" will, liegen die sowieso in einer Datenbank um sie zu verifizieren. Somit ist es völlig egal, wenn der Algorhytmus bekannt ist, da ja kein Gegegenstück in der Datenbank existiert.
Wenn es ohne Datenbank gehen soll, kann es nie sicher sein. Zeigen ja die ganzen Keygeneratoren usw. für Software.
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
Grüße,
wenn timestamp eine sicherheitslücke ist, nimm den und addiere/multipliziere mit einer zufällig generierten zahl (kann ruhig 1-3 stellig sein)- somit hättest du die lösung in 2 zeilen.
ob es den hohen ansprüchen genügt, weiss ich nicht.
MFG
bleicher