Créer un mot de passe aléatoirement

Eléphanteau du PHP | 23 Messages

09 nov. 2006, 16:03

bonjour à tous,

existet-il en PHP un moyen pour que le programme génère une chaine de caractère aléatoire ?

merci

ViPHP
ViPHP | 1961 Messages

09 nov. 2006, 16:11

Bonjour,

Une petite idée ICI
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 nov. 2006, 16:31

Peronnellement je recommanderais plutôt de faire un tableau avec les caractères autorisés dans ton mot de passe (ce qui permet d'ajouter des caractères spéciaux et de retirer ceux qui pourraient prêter à confusion quand on les donnes à l'utilisateur (O et 0, i et l, ...)) et d'utiliser la fonction rand() pour y lire autant de caractères que souhaité dans le mot de passe :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 19672 Messages

09 nov. 2006, 20:13

Autre méthode que j'utilise dans un de mes scripts avec une mini classe :
<?php
/**
 * Micro classe de génération automatique de mots de passe;
 *
 */
class motdepasse
{
    /**
     * Mot de passe
     *
     * @var String
     */
    private $pass;

    /**
     * Nombre de caractères du mot de passe
     *
     * @var Int
     */
    private $longueur;

    /**
     * Constructeur
     *
     * @param  Int $long facultatif, longueur du mot de passe, par défaut, 8 caractères
     * @return motdepasse
     */

    public function __construct($long = 8)
    {
        $this->pass = "";
        $this->longueur = $long;
    }

    /**
     * Génération du mot de passe
     *
     * <p>Création d'une chaîne de caractères choisis aléatoirement dans les caractères autorisés</p>
     *
     * @return String
     */
    public function generer()
    {
        //mot de passe de 8 caractères
        for($i = 0; $i < $this->longueur; $i++)
        {
            $num = rand(48,122);
            /* Alphabet : minuscules */
            if(($num >= 97 && $num <= 122))
            {
                $this->pass .= chr($num);
            }
            /* Alphabet Majuscule */
            elseif(($num >= 65 && $num <= 90))
            {
                $this->pass .= chr($num);
            }
            /* Chiffres de 0 à 9 */
            elseif(($num >= 48 && $num <= 57))
            {
                $this->pass .= chr($num);
            }
            /* Underscore */
            elseif($num == 95)
            {
                $this->pass .= chr($num);
            }
            /* Les autres caractères seront ignorés */
            else
            {
                $i--;
            }
        }
        return $this->pass;
    }
}

/**
 * Utilisation
 * D'abord par défaut
 * Ensuite en donnant un nombre de caractères différent
 */
$gen_mdp1 = new motdepasse();
$mdp1 = $gen_mdp1->generer();
echo("<p>Mot de passe par défaut (8 caractères) : ". $mdp1 ."</p>");

$gen_mdp2 = new motdepasse(6);
$mdp2 = $gen_mdp2->generer();
echo("<p>Mot de passe de longueur définie à 6 caractères : ". $mdp2 ."</p>");
?>
L'exécution de ce code va donner par exemple ceci :
Mot de passe par défaut (8 caractères) : axoDRRLw

Mot de passe de longueur définie à 6 caractères : AzONMl
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 197 Messages

09 nov. 2006, 20:53

j'ai vachement plus simple :
function gen_pass($long=8) {
$pass = strtolower ( substr( md5( rand() * 1000 ) , 0 , $long ) );
return $pass;
}

//utilisation :

$mdp_genere=gen_pass(); // longueur 8 par défaut
$mdp_genere2=gen_pass(10); //longueur 10
ça crée un mot de passe avec des lettres minuscules et des chiffre d'une longueur de 8

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 nov. 2006, 11:55

Pour information (même si ce n'est pas tout à fait le sujet) et d'une manière générale, pour qu'un mot de passe soit considéré comme "sécurisé" il faut :
- entre 8 et 16 caractères
- un mot qui ne soit pas dans le dictionnaire (que ce soit français ou anglais)
- qu'il respecte au minimum 3 conditions parmi ces 4 :
* avoir au moins une majuscule
* avoir au moins une minuscule
* avoir au moins un chiffre
* avoir au moins un caractère spécial
Si cela branche quelqu'un d'en faire un vrai qui va bien :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 1961 Messages

10 nov. 2006, 15:05

Bonjour,

@ryle
J'ai bien une classe qui rempli toutes les conditions que tu proposes mais elle est développée en PHP5. Comme nous sommes sur le forum de PHP4 je ne sais pas si je peux la poster ?
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 193 Messages

10 nov. 2006, 15:19

Non, on est sur le forum "Débuter en PHP" :p

ViPHP
ViPHP | 1961 Messages

10 nov. 2006, 15:25

Re,
Tu as raison [-o<
Mais c'est toujours pas du PHP5 [-X
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 nov. 2006, 15:32

Les noms des forums permettent d'orienter les posteurs en fonction de leur niveau. Mais ça ne t'interdit pas de poster du code PHP5 dans un autre forum, à partir du moment où tu le précise ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 1961 Messages

10 nov. 2006, 15:45

Ok zeus,
C'est une class en PHP 5 donc il ne sera pas utilisable sans adaptation en PHP 4.
J'ai écri ce code à mes débuts en PHP, donc soyez indulgeants mais les critiques sont acceptées.
<?php
/*
** REQUIS	: PHP 5
**
** AUTEUR	: José L.
** DATE		: 17/03/2006
**
** Génère un mot de passe qui remplit les conditions suivantes :
** 1 majuscule, 1 minuscule, 1 chiffre, 1 caractère spécial, LG mini et LG maxi définies par les constantes MINI_LG_PASSWD et MAXI_LG_PASSWD
** On ne s'accupe pas de savoir si le mot est dans le dictionnaire (de n'importe quelle langue)
** vu qu'il comporte obligatoirement un chiffre et un caractère spécial
**
** MODIFICATIONS :
**		AUTEUR	:
**		DATE		:
*/
class Password{
	const MINI_LG_PASSWD = 8;
	const MAXI_LG_PASSWD = 16;
	private $tmpPass = Array();
	
	/* Caractères exclus, en fonction de la police => risque de confusion (dans l'ordre du tableau '$charsExclus')
		Chiffres : 0, 1. Majus : I, L, O. Minus : i, l, o. Spéc : | (pipe), Le ! est exclu dans la fourchette
	*/
	private $charsExclus = Array(48, 49, 73, 76, 79, 105, 108, 111, 124);
	
	private function _getValidChar($minVal, $maxVal){
		while(true){
			$asciiVal = mt_rand($minVal, $maxVal);
			if(!in_array($asciiVal, $this->charsExclus)){
				return (chr($asciiVal));
			}
		}
	}
	/*
	** Constructeur
	** @param : <$length> int 
	*/
	public function __construct($_length = 8){
		$_len = intVal($_length);
		if($_len < self::MINI_LG_PASSWD || $_len > self::MAXI_LG_PASSWD){
			throw new Exception ('La longueur doit etre comprise entre ' . self::MINI_LG_PASSWD . ' et ' . self::MAXI_LG_PASSWD . ' caracteres');
		}
		
		/*
			Pour être sur qu'il rempli les conditions imposées
			on génère em premier les 4 élémets pour les 4 conditions
		*/
		// Majuscules
		array_push($this->tmpPass, $this->_getValidChar(65, 90));
		
		// Minuscules
		array_push($this->tmpPass, $this->_getValidChar(97, 122));
		/* Chiffres
			Pour les chiffres l'appel à la méhode _getValidChar() n'est pas obligatoire
			(on exclu le 0 et le 1 dans la fourchette)
			Mais pour une question d'homogénéité
		*/
		
		array_push($this->tmpPass, $this->_getValidChar(50, 57));
		
		/* Comme les caractères spéciaux sont sur 4 plages et pour ne pas toujours utiliser la même
			on va jouer sur le modulo de l'heure et minutes en cours
		*/
		$heure = date('Hi');
		if($heure % 5 == 0){
			array_push($this->tmpPass, $this->_getValidChar(33, 47));
		}elseif($heure % 3 == 0){
				array_push($this->tmpPass, $this->_getValidChar(58,64));
			}elseif($heure % 2 == 0){
					array_push($this->tmpPass, $this->_getValidChar(91, 96));
				}else{
					array_push($this->tmpPass, $this->_getValidChar(123, 126));
				}
			
		// On genère au hasar les valeurs restantes
		while(count($this->tmpPass) < $_len){
			array_push($this->tmpPass, $this->_getValidChar(34, 126));
		}
		/* Pour terminer on mélange le tableau pour nr pas avoir toujours
			les 4 premiers caractères dans l'ordre de génération
		*/
		shuffle($this->tmpPass);
	} //END-CONSTRUCT
	
	/*
	** Retourne le mot de passe généré
	*/
	public function getPassword(){
		return(implode($this->tmpPass));
	}
}
/*
** Exemple d'utilisation
*/
try{
	$pass = new Password();
	echo $pass->getPassword();
}catch (Exception $e){
	echo $e->getMessage();
	exit(1);
}
?>
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 197 Messages

10 nov. 2006, 16:29

oui mais faire un mot de passe "sécurisé" comme tu as dis, quel est l'interet ? surtout quand tu génères un mot de passe, c'est un truc provisoire où tu changes directement et dans 99% des cas ça remplit pas toutes les conditions.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 nov. 2006, 16:47

Avoir bonne conscience ? :)

C'est pour ça que je disais que c'était un peu hors sujet, vu qu'en effet il est généralement destiné à être modifié :)
Mais on ne peut pas savoir s'il sera modifié, ni quand il sera modifié.. c'est donc également une sécurité pour toi (sinon autant ne pas mettre de mot de passe et lui en demander un à la première connexion)

Pis si même l'administrateur ne se foule pas avec les mots de passe, pourquoi l'utilisateur le ferait ? même si ça n'en inspire que 2 sur 100 qui ne mettrons plus leurs dates d'anniversaire, c'est toujours ça de pris ;)

Ceci dit au dela de l'aspect sécurité, je recommande tout de même dans ce qu'à fait Ajoloca l'exclusion de certains caractères pour éviter nombre de retour d'utilisateurs mécontentes (et croyez moi qu'on monte vite à des 15-20%) qui n'auront pas fait la différence entre un O et un zéro, un L minuscule et un i majuscule, etc. et qui viendront vous dire que leur mot de passe ne marche pas :x

En tout cas merci pour la classe, je vais probablement la repiquer pour en faire une en php4 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 1961 Messages

10 nov. 2006, 17:53

Re,

Les caractères dont tu parles et d'autres sont exclus, mais la class reste ouverte aux modifications. Pour ajouter un caractère à exclure il suffit d'ajouter son code ASCII dans le tableau '$charsExclus'.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein