IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Mot de passe PHPBB - code php


Sujet :

Langage PHP

  1. #1
    Invité de passage
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2025
    Messages : 13
    Par défaut Mot de passe PHPBB - code php
    Bonjour.
    Je dois intégrer des nouveaux membres (environ 1500) dans un forum PHPBB (logiciel open source de gestion de forum). Je dispose d'une table avec l'ID du membre, le mot de passe en clair et d'un champs password vide dans lequel je dois mettre le mot de passe hash avec autant de ligne que de membres.

    Dans la table PHPBB des users les mots de passe sont "hash" en argon2id (méthode de hash).

    Pour exemple voici ce que donne un champ user_password : $argon2id$v=19$m=65536,t=4,p=2$dGsxbVNFZ2M3bE5ZUGM1Lw$i6FsJaZK/Z32ACpWnjZ8xnnpuTV8YfPktsis8oy/aeU
    On voit que le champ contient au début la méthode de hash et les paramètres qui suivent (v=19 m=65536 t=4 p=2)
    Pour tester la méthode de hash voici un lien : https://argon2.online/

    Dans le pack PHPBB il y a un répertoire avec des fichiers php pour la gestion des mots de passe. Je voudrais utiliser ce code php pour générer automatiquement les mots de passe. Voici 2 modules en php qui je pense pourraient me servir mais je n'y comprend rien et je n'ai aucune idée de comment les utiliser.
    Voici le fichier convert_password.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
    /**
    *
    * This file is part of the phpBB Forum Software package.
    *
    * @copyright (c) phpBB Limited <https://www.phpbb.com>
    * @license GNU General Public License, version 2 (GPL-2.0)
    *
    * For full copyright and license information, please see
    * the docs/CREDITS.txt file.
    *
    */
     
    namespace phpbb\passwords\driver;
     
    class convert_password extends base
    {
    	const PREFIX = '$CP$';
     
    	/**
    	* {@inheritdoc}
    	*/
    	public function get_prefix()
    	{
    		return self::PREFIX;
    	}
     
    	/**
    	* {@inheritdoc}
    	*/
    	public function hash($password, $user_row = '')
    	{
    		return false;
    	}
     
    	/**
    	* {@inheritdoc}
    	*/
    	public function check($password, $hash, $user_row = array())
    	{
    		return false;
    	}
    }
    Voici le fichier argon2id.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    /**
    *
    * This file is part of the phpBB Forum Software package.
    *
    * @copyright (c) phpBB Limited <https://www.phpbb.com>
    * @license GNU General Public License, version 2 (GPL-2.0)
    *
    * For full copyright and license information, please see
    * the docs/CREDITS.txt file.
    *
    */
     
    namespace phpbb\passwords\driver;
     
    class argon2id extends argon2i
    {
    	/**
    	* {@inheritdoc}
    	*/
    	public function get_algo_name()
    	{
    		return 'PASSWORD_ARGON2ID';
    	}
     
    	/**
    	* {@inheritdoc}
    	*/
    	public function get_prefix()
    	{
    		return '$argon2id$';
    	}
    }
    Je connais un peu php, surtout pour exécuter des requètes SQL mais pas assez pour comprendre ce code. Si vous avez besoin d'autres éléments pour m'aider je suis à votre disposition.

    D'avance merci et bonne fin de journée.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 713
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 713
    Par défaut
    j'ai l'impression que le plus gros du calcul du hachage se fait dans la classe suivante :
    https://github.com/phpbb/phpbb/blob/...ds/manager.php
    mais ça a l'air d'utiliser plusieurs classes donc ce n'est pas évident à utiliser.

  3. #3
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 481
    Par défaut
    Bonjour,

    Pour générer la clé de hachage des mots de passe, ne peux tu pas simplement utiliser la fonctions php password_hash() avec la constante PASSWORD_ARGON2ID pour utiliser l'algorithme Argon2id ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    $users = [
        'pseudo1' => 'password1',
        'pseudo2' => 'password2',
    ];
     
    foreach ($users as $pseudo => $password) {
        $hash = password_hash($password, PASSWORD_ARGON2ID);
     
        echo $pseudo . ' - hash : ' . $hash . "\n";
    }

  4. #4
    Invité de passage
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2025
    Messages : 13
    Par défaut
    Bonjour et merci Pytet.

    Je vais essayer le code que tu m'as donné et en fonction du résultat je vous dirais.

    J'ai pas mal regardé à droite et à gauche pour solutionner mon problème mais ce n'est pas évident. Utiliser la fonction password_hash en passant l'algo argon2id est certainement la solution.
    Mais je me pose la question des paramètres a passer pour l'algorithme. A savoir ce qui se trouve au début du password encodé que j'ai donné en exemple : $argon2id$v=19$m=65536,t=4,p=2$
    Après pas mal de tests v=19 ne change jamais.
    Dans mon cas et pour les autres paramètres c'est :
    m=65536 Mémoire allouée
    t=4 Time cost (par défaut 4)
    p=2 thread (par défaut 2)
    De plus il y a le sel (ou salt) qui est la clé ayant servi à l'encodage (ou générée par l'encodage ?). Je dois sauvegarder ce sel dans la base de données PHPBB.

    Donc mes questions :
    Je passe comment les paramètre de l'algorithme utilisé (argon2id) quand j'appelle la fonction password_hash.
    Comment je récupère le sel (salt) une fois le hachage effectué pour l'écrire dans la bdd en même temps que le password haché.

    Encore merci pour votre aide.

  5. #5
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 481
    Par défaut
    Les options peuvent être passées en 3ème paramètre de password_hash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
     
    $options = [
        'memory_cost' => 65536,
        'time_cost' => 4,
        'threads' => 2
    ];
     
    $users = [
        'pseudo1' => 'password1',
        'pseudo2' => 'password2',
    ];
     
    foreach ($users as $pseudo => $password) {
        $hash = password_hash($password, PASSWORD_ARGON2ID, $options);
     
        echo $pseudo . ' - hash : ' . $hash . "\n";
    }
    Le salt est automatiquement généré et intégré dans le résultat de password_hash(), tu n'as pas besoin de le récupérer pour le stocker séparément.

  6. #6
    Invité de passage
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2025
    Messages : 13
    Par défaut
    Merci beaucoup Pytet, ça marche impeccablement. J'ai même vérifié avec password_verify (le salt est bien dans le mot de passe haché).

  7. #7
    Invité de passage
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2025
    Messages : 13
    Par défaut
    Bonjour à tous, bonjour Pytet.

    Maintenant j'essaie de "hash" des mots de passe dans une table. Cette table se nomme in_php_password. Elle comporte 2 champs : pass_password_clair et pass_password_hash.
    pass_password_clair contient un mot de passe en clair et pass_password_hash doit contenir le mot de passe en argon2id. Il y a 1420 lignes dans la table.

    Voici le fichier php que j'ai écrit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    $options = [
        'memory_cost' => 65536,
        'time_cost' => 4,
        'threads' => 2
    ];    
     
    $servername = "localhost";
        $username  = "sdk";
        $password  = "tslgrupu";
        $DBname     = "migration";
     
        // Créer une connexion
        $conn = mysqli_connect($servername, $username, $password, $DBname);
     
        // Vérifier la connexion
        if (!$conn) {
            die("La connexion a échoué: " . mysqli_connect_error());
        }
        echo "Connecté avec succès";
     
    $sql = "UPDATE in_php_password SET pass_password_hash = password_hash(pass_password_clair, PASSWORD_ARGON2ID, $options)";
    $mysqli->query($sql);
     
     
        // Fermer la connexion
     mysqli_close($conn);
     
    ?>
    Quand j'exécute le fichier dans mon navigateur (edge), voici ce que j'obtiens :

    Connecté avec succès
    Warning: Array to string conversion in C:\xampp\htdocs\migration\connect1.php on line 22
    Warning: Undefined variable $mysqli in C:\xampp\htdocs\migration\connect1.php on line 23
    Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\migration\connect1.php:23 Stack trace: #0 {main} thrown in C:\xampp\htdocs\migration\connect1.php on line 23

    Donc je crois comprendre 2 choses :
    Je me connecte bien au serveur localhost et à la base de données.
    Il y a un problème avec la table $option lors de l'appel de la fonction password_hash.

    Pouvez-vous me donner une idée de ce que j'ai loupé ? J'ai essayé de m'inspirer du code de Pytet, qui lui marche très bien.

    Merci pour votre aide et bonne journée.

  8. #8
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 481
    Par défaut
    Tu ne peux pas exécuter la fonction php password_hash dans la requête sql :
    1. Fait une première requête sql SELECT pour récupérer tous les mots de passe en clair
    2. Pour chaque résultat de la première requête, génère le hash via password_hash puis fait une autre requête sql UPDATE pour mettre à jour pass_password_hash en bdd

  9. #9
    Invité de passage
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2025
    Messages : 13
    Par défaut
    Bonjour Pytet.

    Merci pour ta réponse mais je t'avoue que si je comprend le concept, je ne vois pas du tout comment le mettre en oeuvre.

    Pour le moment il y a 3 champs dans la table in_php_password.
    pass_member_id (qui est unique et qui pointe sur la table des users que je doit mettre à jour au final avec le pass_password_hash)
    pass_password_clair (que j'ai généré avec une API. Il y a 164 mots de passe différents que j'ai répété pour avoir mes 1420 lignes.
    pass_password_hash (que je dois générer avec la fonction password_hash pour mettre à jour ma table users au final)

    D'après ce que tu m'as dit, je crois comprendre que je dois :

    Lire complètement la table donc SELECT pass_password_clair FROM in_php_password
    Faire une boucle sur chaque ligne trouvée jusqu'à fin des lignes
    appeler password_hash pour la ligne en cours
    mettre à jour le champ pass_password_hash dans la table in_php_password pour la ligne en cours
    lire la ligne suivante
    Fin de la boucle

    Je découvre PHP et SQL et je ne vois pas du tout comment coder tout ça.

    Je suis un retraité de l'informatique et je travaillais avec des fichiers en séquentiel indexé. Donc j'ai du mal a conceptualiser "tout lire d'un coup et ensuite traiter un à un".
    Dans ma tête je pense plus "lire un à un et traiter un à un". Du coup je ne sais pas du tout comment faire.
    Alors si tu as une solution, ça m'aiderai une nouvelle fois beaucoup.
    Merci beaucoup à toi.

  10. #10
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 481
    Par défaut
    Tu as bien compris le process, ton algorithme est correct.

    Pour le transcrire en PHP, tu peux t'inspirer de ce code (code non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
     
    $options = ['memory_cost' => 65536, 'time_cost' => 4, 'threads' => 2];
     
    mysqli_report(MYSQLI_REPORT_ALL);
    $mysqli = new mysqli('localhost', 'sdk', 'mdp_bdd', 'migration');
     
    $result = $mysqli->query('SELECT pass_member_id, pass_password_clair FROM in_php_password');
    $inPhpPasswords = $result->fetch_all(MYSQLI_ASSOC);
     
    foreach ($inPhpPasswords as $inPhpPassword) {
        $hash = password_hash($inPhpPassword['pass_password_clair'], PASSWORD_ARGON2ID, $options);
     
        $mysqli->query(
            sprintf("UPDATE in_php_password SET pass_password_hash = '%s' WHERE pass_member_id = '%s'",
                $mysqli->real_escape_string($hash),
                $mysqli->real_escape_string($inPhpPassword['pass_member_id'])
            )
        );
    }

  11. #11
    Invité de passage
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2025
    Messages : 13
    Par défaut
    Le code est très bon et ça a marché.
    J'ai juste eu une erreur sur la ligne $result = $mysqli->query('SELECT pass_member_id, pass_password_clair FROM in_php_password');
    L'erreur était : Fatal error: Uncaught mysqli_sql_exception: No index used in query/prepared statement SELECT pass_member_id, pass_password_clair FROM in_php_password in C:\xampp\htdocs\migration\connect2.php:11 Stack trace: #0 C:\xampp\htdocs\migration\connect2.php(11): mysqli->query('SELECT pass_mem...') #1 {main} thrown in C:\xampp\htdocs\migration\connect2.php on line 11

    Dans un premier temps j'ai créé un index sur le pass_member_id en unique. En relançant j'avais la même erreur. J'ai donc cherché sur internet et j'ai trouvé cette solution :
    Changer la ligne mysqli_report(MYSQLI_REPORT_ALL); par mysqli_report(MYSQLI_REPORT_OFF);

    Ca a fonctionné mais en 120 secondes les 1420 lignes n'étaient pas toutes traitées. Donc il a fallu que je relance en ajoutant la ligne ini_set('max_execution_time', 0);

    Maintenant c'est bon. J'ai tous mes passwords hash.

    Encore merci pour ton aide et heureusement qu'il y a des personnes telles que toi.

Discussions similaires

  1. probleme de mot de passe sous easy php 2.0B1
    Par ELVIRA dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 29/11/2007, 05h57
  2. [phpBB] Code PHP non interprété dans un thème subsilver
    Par killpilot dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 24/06/2007, 12h42
  3. [Système] Changer un mot de passe unix via PHP
    Par gordon00 dans le forum Langage
    Réponses: 3
    Dernier message: 03/06/2007, 18h11
  4. mot de passe sur code VBA
    Par Cupidon dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/02/2007, 16h05
  5. [Sécurité] Crypter un mot de passe UNIX avec PHP
    Par dom78 dans le forum Langage
    Réponses: 3
    Dernier message: 15/05/2006, 20h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo