Une classe de génération de mot de passe

Contenu du snippet

Une petite classe qui prend en charge la génération automatique de mot de passe.

Je n'ai pas inventé grand chose, mais... j'ai réuni plusieurs sources dans une classe.

Vous y trouverez plusieurs possibilités comme :
- Définir la taille du mot de passe à générer
- Définir si le mot de passe ne doit contenir que des lettres,
- Définir si le mot de passe peut contenir des majuscules et des minuscules,
- Définir si le mot de passe peut contenir des chiffres et/ou des caractères spéciaux

Source / Exemple :


<?php
/******************************************************************************/
/* Nom          : password_manager.class.php                                  */
/* Auteur       : Dièse Include                                               */
/* Date         : Sep 2007                                                    */
/* Projet       : FRAMEWORK Dièse Include                                     */
/* Objet        : Utilitaires de gestion et génération de mots de passe       */
/******************************************************************************/

/******************************************************************************/
/* Importation des packages                                                   */
/******************************************************************************/

/******************************************************************************/
/* Interface                                                                  */
/******************************************************************************/

class password_manager {
  
  /****************************************************************************/
  /* Définition des propriétés de la classe                                   */
  /****************************************************************************/
  var $default_password_length          = 15; // Longueur par défaut du mot de passe
  var $use_only_letters                 = true; // Vrai si le mot de passe ne doit comporter que des lettres
  var $case_sensitive                   = false; // Vrai si le mélange maj et min est autorisé
  var $use_special_char                 = false; // Vrai si le mot de passe peut contenir des caractères spéciaux
  var $encrypt_method                   = "md5"; // Par défaut cryptage MD5
  var $clear_password                   = ""; // Mot de passe en clair généré
  
  // Définition des tableaux de caractères utilisables
  var $usable_chars                     = array();
  /****************************************************************************/
  /* Définition des méthodes publiques                                        */
  /****************************************************************************/
  
  /****************************************************************************/
  /* public void constructor password_manager(void)                           */
  /*  @access public                                                          */
  /*  @type constructeur                                                      */
  /*  @param void                                                             */
  /*  @return void                                                            */
  /*  @abstract Instancie un objet de type password_manager                   */
  /****************************************************************************/
  function password_manager(){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    return;
  }
  
  /****************************************************************************/
  /* public void set_password_length(int length)                              */
  /*  @access public                                                          */
  /*  @type setter                                                            */
  /*  @param int $length => longueur par défaut du mot de passe               */
  /*  @return void                                                            */
  /*  @abstract Définit la longueur par défaut du mot de passe                */
  /****************************************************************************/
  function set_password_length($length){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    $max_password_length          = 15; // Longueur maximale à ne pas dépasser
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    if(defined('MAX_PASSWORD_LENGTH'))
      $max_password_length = MAX_PASSWORD_LENGTH;
      
    if($length == 0 || $length > $max_password_length){
      $this->default_password_length = $max_password_length;
    } else {
      $this->default_password_length = $length;
    }
    
    return;
  }
  
  /****************************************************************************/
  /* public void use_only_letters(bool use)                                   */
  /*  @access public                                                          */
  /*  @type setter                                                            */
  /*  @param bool $use                                                        */
  /*  @return void                                                            */
  /*  @abstract Détermine si le mot de passe est constitué ou non de lettres  */
  /*    uniquement.                                                           */
  /****************************************************************************/
  function use_only_letters($use){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    $this->use_only_letters = $use;
      
    return;
  }

  /****************************************************************************/
  /* public void use_special_char(bool use)                                   */
  /*  @access public                                                          */
  /*  @type setter                                                            */
  /*  @param bool $use                                                        */
  /*  @return void                                                            */
  /*  @abstract Détermine si le mot de passe peut contenir des caractères     */
  /*    spéciaux.                                                             */
  /****************************************************************************/
  function use_special_char($use){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    $this->use_special_char = $use;
      
    return;
  }
    
  /****************************************************************************/
  /* public void is_case_sensitive(bool sensitive)                            */
  /*  @access public                                                          */
  /*  @type setter                                                            */
  /*  @param bool $sensitive                                                  */
  /*  @return void                                                            */
  /*  @abstract Détermine si le mot de passe est constitué de maj et min      */
  /*    ou seulement de minuscules                                            */
  /****************************************************************************/
  function is_case_sensitive($sensitive){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    $this->case_sensitive = $sensitive;
      
    return;
  }
  
  /****************************************************************************/
  /* public void set_encrypt_method(string method)                            */
  /*  @access public                                                          */
  /*  @type setter                                                            */
  /*  @param string $method => méthode d'encryptage à utiliser                */
  /*    - md5 par défaut,                                                     */
  /*    - sha1                                                                */
  /*    - custom : encryptage #Include                                        */
  /*  @return void                                                            */
  /*  @abstract Détermine la méthode d'encryptage du mot de passe             */
  /****************************************************************************/
  function set_encrypt_method($method){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    $mns_method         = ""; // Chaîne réduite en minuscules
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    if($method != ""){
      $mns_method = strtolower($method);
      if($mns_method == "md5" || $mns_method=="sha1" || $mns_method == "custom"){
        $this->encrypt_method = $mns_method;
      }
    }
      
    return;
  }
  
  /****************************************************************************/
  /* public void genere_password(void)                                        */
  /*  @access public                                                          */
  /*  @type Fonction                                                          */
  /*  @param void                                                             */
  /*  @return void                                                            */
  /*  @abstract Génère un mot de passe aléatoire à partir des définitions     */
  /*  @comment Ajouter à terme un système évitant de doubler les lettres      */
  /****************************************************************************/
  function genere_password(){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    $usable_chars_length          = 0; // Taille du tableau des caractères utilisables
    $clear_password               = ""; // Mot de passe en clair généré
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    // Récupère la tables des minuscules systématiquement
    $this->add_min_table();
    
    if($this->case_sensitive){
      $this->add_maj_table();  
    }
    
    if(!$this->use_only_letters){
      $this->add_digit_table();
    }
    
    if($this->use_special_char){
      $this->add_special_chars_table();
    }
    
    // En sortie $this->usable_chars contient l'ensemble des caractères utilisables
    
    // Génère ensuite aléatoirement une chaîne de taille égale à la taille souhaitée
    for($i=0;$i<$this->default_password_length;$i++){
      $clear_password .= $this->usable_chars[$this->tirage()];  
    }
    
    // Le mot de passe est généré
    $this->clear_password = $clear_password;
    
    # Debug
    #echo "Mot de passe généré : " . $clear_password . " Taille : " . strlen($clear_password) . "<br/>\n";
    # Fin Debug
    
    return; 
  }
  
  /****************************************************************************/
  /* public string get_encrypted_password(void)                               */
  /*  @access public                                                          */
  /*  @type getter                                                            */
  /*  @param void                                                             */
  /*  @return string                                                          */
  /*  @abstract Retourne le mot de passe encrypté selon la méthode définie    */
  /****************************************************************************/
  function get_encrypted_password(){
    /**************************************************************************/
    /* Définition des variables locales                                       */
    /**************************************************************************/
    $scramble_password          = ""; // Mot de passe crypté
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    
    if($this->clear_password == ""){
      $this->genere_password();
    }
    
    // En fonction de l'algorithme de cryptage
    switch($this->encrypt_method){
      case 'md5':
        $scrambled_password = md5($this->clear_password);
      break;
      case 'sha1':
        $scrambled_password = sha1($this->clear_password);
      break;
      case 'custom':
        // Ajoutez ici votre propre algorithme de cryptage... si besoin
        $scrambled_password = $this->clear_password;
      break;
    }
    
    return $scrambled_password;
  }
  
  /****************************************************************************/
  /* public string get_clear_password(void)                                   */
  /*  @access public                                                          */
  /*  @type getter                                                            */
  /*  @param void                                                             */
  /*  @return string                                                          */
  /*  @abstract Retourne le mot de passe en clair                             */
  /****************************************************************************/
  function get_clear_password(){
    /**************************************************************************/
    /* Définition des variables locales                                       */
    /**************************************************************************/
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    
    if($this->clear_password == ""){
      $this->genere_password();
    }
        
    return $this->clear_password;
  }
  /****************************************************************************/
  /* Définition des méthodes protégées                                        */
  /****************************************************************************/
  
  /****************************************************************************/
  /* Définition des méthodes privées                                          */
  /****************************************************************************/
  
  /****************************************************************************/
  /* private int tirage(void)                                                 */
  /*  @access private                                                         */
  /*  @type Méthode                                                           */
  /*  @param void                                                             */
  /*  @return int                                                             */
  /*  @abstract Retourne une valeur entière aléatoire comprise entre 0 et     */
  /*    la taille maximale du tableau des caractères utilisables.             */
  /****************************************************************************/
  function tirage(){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    $usable_char_bound          = 0; // Taille maximale du tableau des caractères utilisables
    
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    $usable_char_bound = sizeof($this->usable_chars) - 1;
    
    // Initialise le générateur de nombre aléatoire
    srand((double)microtime()*1000000);
    
    return rand(0,$usable_char_bound);
  }
  /****************************************************************************/
  /* private void add_min_table(void)                                         */
  /*  @access private                                                         */
  /*  @type getter                                                            */
  /*  @param void                                                             */
  /*  @return void                                                            */
  /*  @abstract Ajoute la table des minuscules au tableau des caractères      */
  /*    utilisables.                                                          */
  /****************************************************************************/
  function add_min_table(){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    $min_chars = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n',
      'o','p','q','r','s','t','u','v','w','x','y','z');
      
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    $this->usable_chars = array_merge($this->usable_chars,$min_chars);
    
    return;
  }

  /****************************************************************************/
  /* private void add_maj_table(void)                                         */
  /*  @access private                                                         */
  /*  @type getter                                                            */
  /*  @param void                                                             */
  /*  @return void                                                            */
  /*  @abstract Ajoute la table des majuscules au tableau des caractères      */
  /*    utilisables.                                                          */
  /****************************************************************************/
  function add_maj_table(){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    $maj_chars = array('A','B','B','D','E','F','G','H','I','J','K','L','M','N',
      'O','P','Q','R','S','T','U','V','W','X','Y','Z');
      
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    $this->usable_chars = array_merge($this->usable_chars,$maj_chars);
    
    return;
  }
  
  /****************************************************************************/
  /* private void add_digit_table(void)                                       */
  /*  @access private                                                         */
  /*  @type getter                                                            */
  /*  @param void                                                             */
  /*  @return void                                                            */
  /*  @abstract Ajoute la table des chiffres au tableau des caractères        */
  /*    utilisables.                                                          */
  /****************************************************************************/
  function add_digit_table(){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    $digits = array('0','1','2','3','4','5','6','7','8','9');
      
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    $this->usable_chars = array_merge($this->usable_chars,$digits);
    
    return;
  }
  
  /****************************************************************************/
  /* private void add_special_chars_table(void)                               */
  /*  @access private                                                         */
  /*  @type getter                                                            */
  /*  @param void                                                             */
  /*  @return void                                                            */
  /*  @abstract Ajoute la table des caractères spéciaux au tableau des        */
  /*    caractères utilisables.                                               */
  /****************************************************************************/
  function add_special_chars_table(){
    /**************************************************************************/
    /* Déclaration des variables locales                                      */
    /**************************************************************************/
    $special_chars = array('@','$','^','+','-','|','!','#','*','/');
      
    /**************************************************************************/
    /* Implémentation                                                         */
    /**************************************************************************/
    $this->usable_chars = array_merge($this->usable_chars,$special_chars);
    
    return;
  }   
                                                               
}
?>

Conclusion :


Au final, pour générer un mot de passe...

include("password_manager.class.php");

$mon_password = new password_manger();

// Vous pouvez spécifier les options... Par défaut, le mot de passe aura une longueur de 15 caractères
// et sera constitué uniquement de caractères alphabétiques en minuscules
// Le cryptage se fera en MD5

$mon_password->set_password_length(6);
$mon_password->is_case_sensitive(true);
$mon_password->use_only_letters(false);

echo "Le mot de passe généré (en clair...) est : " . $mon_password->get_clear_password() . "<br/>";
echo "Le mot de passe généré (crypté...) est : " . $mon_password->get_encrypted_password() . "<br/>";

Pour ceux qui veulent s'amuser, vous pouvez ajouter votre propre algo de cryptage... il vous suffira alors d'utiliser la méthode :

set_encrypt_method("custom") pour générer le cryptage maison (attention à la juridiction en vigueur en France)et modifier la méthode get_encrypted_password() pour implémenter votre algo.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.