web-dev-qa-db-fra.com

Comment générer des mots de passe aléatoires avec PHP?

Ou existe-t-il un logiciel permettant de générer automatiquement des mots de passe aléatoires?

34
user198729

Il vous suffit de créer une chaîne aléatoire de a-z, A-Z, 0-9 ( ou de ce que vous voulez ) jusqu'à la longueur souhaitée. Voici un exemple en PHP:

function generatePassword($length = 8) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $count = mb_strlen($chars);

    for ($i = 0, $result = ''; $i < $length; $i++) {
        $index = Rand(0, $count - 1);
        $result .= mb_substr($chars, $index, 1);
    }

    return $result;
}

Pour optimiser, vous pouvez définir $chars en tant que variable statique ou constante dans la méthode ( ou classe parent ) si vous appelez cette fonction plusieurs fois au cours d'une même exécution.

95
Matt Huggins

Voici une solution simple. Il contiendra des lettres minuscules et des chiffres.

substr(str_shuffle(strtolower(sha1(Rand() . time() . "my salt string"))),0, $PASSWORD_LENGTH);

Voici une solution plus forte génère de manière aléatoire les codes de caractères dans la plage de caractères souhaitée pour une longueur aléatoire dans une plage souhaitée.

function generateRandomPassword() {
  //Initialize the random password
  $password = '';

  //Initialize a random desired length
  $desired_length = Rand(8, 12);

  for($length = 0; $length < $desired_length; $length++) {
    //Append a random ASCII character (including symbols)
    $password .= chr(Rand(32, 126));
  }

  return $password;
}
12
Dolph

Je veux jouer au jeu. Le moyen le plus simple serait de faire:

function Rand_passwd( $length = 8, $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ) {
    return substr( str_shuffle( $chars ), 0, $length );
}

Ceci est à peu près juste une modification de la première réponse. Spécifiez les caractères souhaités dans les seconds paramètres et la longueur du mot de passe dans le premier.

5
William

C'est comme ça que je le fais.

$pw = ""; 
for ($i = 0; $i < 13; $i++)
{
    $pw .= chr(Rand(33, 126));
}
4
fooSolver
$password = hash('sha512', Rand());

Ne devrait pas être trop difficile à retenir. Cela pourrait être plus facile à retenir cependant:

$password = substr(hash('sha512',Rand()),0,12); // Reduces the size to 12 chars

Il n’existe que 16 caractères possibles, mais c’est toujours 16 ^ 12 mots de passe possibles (à 300 000 mots de passe/seconde, il faudrait 29 ans pour craquer).

3
Brendan Long

voici une fonction qui génère un mot de passe avec une longueur minimale, un nombre minimal de chiffres et un nombre minimal de lettres.

function generatePassword() {
$min_length=8;  //Minimum length of the password
$min_numbers=2; //Minimum of numbers AND special characters
$min_letters=2; //Minimum of letters

$password = '';
$numbers=0;
$letters=0;
$length=0;

while ( $length <= $min_length OR $numbers <= $min_numbers OR $letters <= $min_letters) {
    $length+=1;
    $type=Rand(1, 3);
    if ($type==1) {
        $password .= chr(Rand(33, 64)); //Numbers and special characters
        $numbers+=1;
    }elseif ($type==2) {
        $password .= chr(Rand(65, 90)); //A->Z
        $letters+=1;
    }else {
        $password .= chr(Rand(97, 122)); //a->z
        $letters+=1;
    }

}
return $password;   
}
2
Ronan Corre

Un bon mot de passe doit être un mélange de majuscules, minuscules, chiffres, lettres, caractères spéciaux et plus de 6 caractères Voici la fonction que j'utilise sur mes applications.

function randomPassword( $length = 8 ) 
{ 
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?"; 
$length = Rand(10, 16); 
$password = substr( str_shuffle(sha1(Rand() . time()) . $chars ), 0, $length );
 return $password;
}
2
Raphael Ndwigah

Aussi, vous pouvez essayer une fonction que j'ai écrite et qui est disponible sur mon blog. L’avantage de cette fonction est qu’elle accorde la même importance aux minuscules, aux majuscules, aux chiffres et aux caractères spéciaux. Vous pouvez le trouver ici PHP fonction de générateur de mot de passe aléatoire

1
Jaspreet Chahal

J'aime mélanger un tableau de caractères aléatoires

$a = str_split("abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY0123456789");
shuffle($a);
echo implode($a); //maxlength
echo "\n".substr( implode($a), 0, 10 ); //instead of 10 => any length

//As function:
function getMeRandomPwd($length){
    $a = str_split("abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY0123456789"); 
    shuffle($a);
    return substr( implode($a), 0, $length );
}
echo "\n".getMeRandomPwd(8)."\n".getMeRandomPwd(11);
// Outpus something like:
// 3Ai4Xf6R2I8bYGUmKgB9jpqo7ncV5teuQhkOHJCNrTP0sLFd1wxSMlEWvyaD
// 3Ai4Xf6R2I
// JsBKWFDa
// gfxsjr3dX70

Si vous souhaitez que le mot de passe soit plus long, concaténez quelques fois charlist :)

1
jave.web

J'utilise les fonctions st_split et implode:

function genarateKey(){
    $limit= 8;
    $chars= 'abcdefghijklmnopqrstuvxwyz1234567890!@#$%^&*()_+=-[]{}\|ABCDEFGHIJKLMNOPQRSTUVXWYZ';
    $chararray= str_split($chars);
    $gen=array();
    for($i=0;$i<$limit;$i++){
        $index=Rand(0,strlen($chars)-1);
        $gen[$i]= $chararray[$index];
    }
    return implode($gen); //converts array to string
}
0

Cette fonction générera un mot de passe plus fort que la solution la plus populaire:

function generatePassword($size=8){
    $p = openssl_random_pseudo_bytes(ceil($size*0.67), $crypto_strong);
    $p = str_replace('=', '', base64_encode($p));
    $p = strtr($p, '+/', '^*');
    return substr($p, 0, $size);      
}

Chaque caractère du mot de passe sera [A-Z] ou [a-z] ou ^ ou *

0
Eugene Mala

Une autre façon très simple (et sécurisée!) De procéder est la suivante (je génère tous mes mots de passe de cette façon):

base64_encode(random_bytes(12));

Cela génère un mot de passe de 16 caractères qui utilise une assez bonne plage de caractères. 

Toutefois, en fonction de vos besoins (par exemple, si un utilisateur doit taper son mot de passe), il peut être souhaitable de supprimer les caractères pouvant être confondus (tels que l, I, 1, 0, O, 5, S, etc.). sur). Dans ce cas, la solution ci-dessus est probablement un peu trop simple.

0
Dave Vogt

Vous pouvez simplement utiliser le paquet Text_Password de PEAR - il prend en charge pas mal d'algorithmes pour les générer; et libère votre temps pour aller sur autre chose.

0
kguest
function generate_password($length = 6) {
    $password = '';
    $chars = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
    for ($i = 0; $i < $length; $i ++) {
        $password .= $chars[array_Rand($chars)];
    }
    return $password;
}
0
Alex S

Cela aidera à créer un mot de passe aléatoire:

<?php
function generatePassword ($length = 8)
{
  $genpassword = "";
  $possible = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
  $i = 0; 
  while ($i < $length) { 
    $char = substr($possible, mt_Rand(0, strlen($possible)-1), 1);
    if (!strstr($genpassword, $char)) { 
      $genpassword .= $char;
      $i++;
    }
  }
  return $genpassword;
} 
?>
<input type="text" value="<?php echo generatePassword(); ?>">

Voici le exemple de travail (Demo)

0
M. Lak