Hallo,
ich muss einmal einen token generieren, den ich an eine Email anhänge. Er wird zugleich in einer db gespeichert, und dort dann abgeglichen.
Das mache ich so:
$randomString = bin2hex(random_bytes(16));
$token = password_hash($randomString, PASSWORD_DEFAULT);
Anschließend soll ein temporäres Passwort generiert werden, was ich so mache:
function generateSecurePassword($length = 12) {
// Definiere die möglichen Zeichenkategorien
$lowercase = 'abcdefghijklmnopqrstuvwxyz';
$uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$numbers = '0123456789';
$special = '!@#$%^&()-_=+[]{}|;:?';
// Sicherstellen, dass die Länge des Passworts mindestens 6 Zeichen beträgt
if ($length < 6) {
throw new Exception('Die Länge des Passworts muss mindestens 6 Zeichen betragen.');
}
// Generiere mindestens 2 Großbuchstaben, 2 Sonderzeichen und 2 Ziffern
$uppercase_part = substr(str_shuffle($uppercase), 0, 2);
$special_part = substr(str_shuffle($special), 0, 2);
$numbers_part = substr(str_shuffle($numbers), 0, 2);
$lowercase_part = substr(str_shuffle($lowercase), 0, $length - 6);
// Kombiniere die Teile und stelle sicher, dass die Sonderzeichen nicht am Anfang oder Ende sind
$password_core = $lowercase_part . $uppercase_part . $numbers_part;
$middle_part = str_shuffle($special_part); // Mische Sonderzeichen für die Mitte
// Erstelle das Passwort ohne Sonderzeichen am Anfang und Ende
$password = str_shuffle($password_core);
$password = substr($password, 0, $length - strlen($middle_part)) . $middle_part;
// Mische das gesamte Passwort
$password = str_shuffle($password);
// Schneide auf die gewünschte Länge
return substr($password, 0, $length);
}
$newPass = generateSecurePassword(15);
Gibt es dabei etwas auszusetzen oder geht es besser oder sinnvoller?
Zumindest, dass kein Sonderzeichen am Anfang und Ende des Passworts stehen soll, klappt so schonmal nicht.
Gruß, Bernd