[openmairie-framework-Commits] r5495 - in openmairie_exemple/branches/POC_migration_mots_de_passe/core: . data/pgsql obj

0 views
Skip to first unread message

nathan...@users.adullact.net

unread,
Feb 27, 2026, 11:38:59 AM (6 days ago) Feb 27
to openmairie...@googlegroups.com
Author: nathanaelhoun
Date: 2026-02-27 17:38:56 +0100 (Fri, 27 Feb 2026)
New Revision: 5495

Modified:
openmairie_exemple/branches/POC_migration_mots_de_passe/core/data/pgsql/v4.11.0-a17.sql
openmairie_exemple/branches/POC_migration_mots_de_passe/core/obj/om_utilisateur.class.php
openmairie_exemple/branches/POC_migration_mots_de_passe/core/om_application.class.php
Log:
chore: ne supporter qu'argon2id, pas bcrypt, ce qui permet de se debarrasser de la verification de longueur de mot de passe

Modified: openmairie_exemple/branches/POC_migration_mots_de_passe/core/data/pgsql/v4.11.0-a17.sql
===================================================================
--- openmairie_exemple/branches/POC_migration_mots_de_passe/core/data/pgsql/v4.11.0-a17.sql 2026-02-27 13:25:06 UTC (rev 5494)
+++ openmairie_exemple/branches/POC_migration_mots_de_passe/core/data/pgsql/v4.11.0-a17.sql 2026-02-27 16:38:56 UTC (rev 5495)
@@ -11,7 +11,7 @@
--

-- Rend la colonne 'pwd' nullable pour permettre de la vider après migration
--- d'un compte vers le nouveau hachage bcrypt.
+-- d'un compte vers le nouveau hachage argon2id.
ALTER TABLE om_utilisateur ALTER COLUMN pwd DROP NOT NULL;

-- Ajout de la colonne 'password_hash' pour stocker les mots de passe hachés

Modified: openmairie_exemple/branches/POC_migration_mots_de_passe/core/obj/om_utilisateur.class.php
===================================================================
--- openmairie_exemple/branches/POC_migration_mots_de_passe/core/obj/om_utilisateur.class.php 2026-02-27 13:25:06 UTC (rev 5494)
+++ openmairie_exemple/branches/POC_migration_mots_de_passe/core/obj/om_utilisateur.class.php 2026-02-27 16:38:56 UTC (rev 5495)
@@ -61,7 +61,7 @@
if ($val["password_hash"] != "*****") {
// Hachage et mise à jour dans la base.
// La colonne 'pwd' est vidée pour marquer le compte comme migré.
- $this->valF["password_hash"] = password_hash($val["password_hash"], OM_PASSWORD_ALGO);
+ $this->valF["password_hash"] = password_hash($val["password_hash"], PASSWORD_ARGON2ID);
$this->valF["pwd"] = null;

// si le mot de passe n'a pas ete modifie, aucune maj dans la base
@@ -96,30 +96,6 @@
}
}

- /**
- * Validation des données du formulaire utilisateur.
- *
- * Vérifie notamment que le mot de passe ne dépasse pas 72 octets lorsque
- * l'algorithme bcrypt est utilisé, car bcrypt tronque silencieusement les
- * mots de passe au-delà de cette limite, ce qui crée une vulnérabilité
- * (deux mots de passe différents après le 72ème octet seraient acceptés).
- */
- function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
- parent::verifier($val, $dnu1, $dnu2);
-
- // Un nouveau mot de passe est soumis s'il est non vide et non égal
- // à la valeur fictive "*****" utilisée pour signifier "pas de changement".
- $new_password = $val["password_hash"] ?? "";
- if ($new_password !== "" && $new_password !== "*****") {
- if (OM_PASSWORD_ALGO === PASSWORD_BCRYPT && strlen($new_password) > 72) {
- $this->correct = false;
- $this->addToMessage(
- __("Le mot de passe ne peut dépasser 72 octets avec la méthode de stockage actuelle. Veuillez choisir un mot de passe plus court.")
- );
- }
- }
- }
-
function setLib(&$form, $maj) {
$form->setLib('pwd', __('Mot de passe (ancien stockage)'));
$form->setLib('password_hash', __('Mot de passe'));

Modified: openmairie_exemple/branches/POC_migration_mots_de_passe/core/om_application.class.php
===================================================================
--- openmairie_exemple/branches/POC_migration_mots_de_passe/core/om_application.class.php 2026-02-27 13:25:06 UTC (rev 5494)
+++ openmairie_exemple/branches/POC_migration_mots_de_passe/core/om_application.class.php 2026-02-27 16:38:56 UTC (rev 5495)
@@ -25,14 +25,10 @@
define("DEBUG", PRODUCTION_MODE);
}

-if (defined("OM_PASSWORD_ALGO") !== true) {
- /**
- * Algorithme utilisé par password_hash() pour hacher les mots de passe.
- * Argon2id est préféré ; bcrypt est utilisé en fallback sur les
- * environnements PHP compilés sans libargon2
- */
- define("OM_PASSWORD_ALGO", defined("PASSWORD_ARGON2ID") ? PASSWORD_ARGON2ID : PASSWORD_BCRYPT);
+if (!defined('PASSWORD_ARGON2ID')) {
+ throw new RuntimeException("PHP doit être compilé avec le support Argon2id (--with-password-argon2) pour la gestion des mots de passe.");
}
+
require_once PATH_OPENMAIRIE."om_logger.class.php";
require_once PATH_OPENMAIRIE."om_filestorage.class.php";
require_once PATH_OPENMAIRIE."om_layout.class.php";
@@ -2938,7 +2934,7 @@
* @return void
*/
function changeDatabaseUserPassword($login, $password) {
- $valF[$this->table_om_utilisateur_field_password_hash] = password_hash($password, OM_PASSWORD_ALGO);
+ $valF[$this->table_om_utilisateur_field_password_hash] = password_hash($password, PASSWORD_ARGON2ID);
// Période de transition : on supprime le mot de passe stocké en md5 s'il existe encore
$valF[$this->table_om_utilisateur_field_password] = null;
$cle = $this->table_om_utilisateur_field_login."='".$login."'";
@@ -3351,9 +3347,7 @@

// Hash fictif pré-calculé sélectionné selon l'algorithme actif.
// Utilisé pour éviter les attaques par timing sur l'énumération de comptes
- $dummyHash = (OM_PASSWORD_ALGO === PASSWORD_BCRYPT)
- ? '$2y$10$F0k7WKJyjjKkzefzzWmMZOmvs/XjfEDklSqc1P.r5BeM250y/K8cu' // password_hash('dummy_openmairie', PASSWORD_BCRYPT)
- : '$argon2id$v=19$m=65536,t=4,p=1$bVhNVUNOcmw2TzRFajE3aQ$vS+8pFyxKo0Jfro1lw5qg9fpbVP3TzekfmcjR89EvjY'; // password_hash('dummy_openmairie', PASSWORD_ARGON2ID)
+ $dummyHash = '$argon2id$v=19$m=65536,t=4,p=1$bVhNVUNOcmw2TzRFajE3aQ$vS+8pFyxKo0Jfro1lw5qg9fpbVP3TzekfmcjR89EvjY'; // password_hash('dummy_openmairie', PASSWORD_ARGON2ID)

// Récupération de l'utilisateur par son login uniquement
// La vérification du mot de passe est faite en PHP pour supporter les
@@ -3398,7 +3392,7 @@
$password_hash = $row[$this->table_om_utilisateur_field_password_hash];

$authenticated = password_verify($password, $password_hash);
- if ($authenticated === true && password_needs_rehash($password_hash, OM_PASSWORD_ALGO)) {
+ if ($authenticated === true && password_needs_rehash($password_hash, PASSWORD_ARGON2ID)) {
$this->rehashPassword($login, $password);
}
}
@@ -3414,8 +3408,8 @@
/**
* Stocke un nouveau hash du mot de passe en base de données.
*
- * Recalcule le hash avec l'algorithme actif (OM_PASSWORD_ALGO), met à jour
- * la colonne 'password_hash' et vide la colonne 'pwd' (champ legacy MD5).
+ * Recalcule le hash, met à jour la colonne 'password_hash'
+ * et vide la colonne 'pwd' (champ legacy MD5).
* Appelée par migrateLegacyPassword() et rehashPassword().
*
* @param string $login Identifiant de l'utilisateur.
@@ -3425,7 +3419,7 @@
*/
private function savePasswordHash($login, $password) {
$valF = array(
- $this->table_om_utilisateur_field_password_hash => password_hash($password, OM_PASSWORD_ALGO),
+ $this->table_om_utilisateur_field_password_hash => password_hash($password, PASSWORD_ARGON2ID),
$this->table_om_utilisateur_field_password => null,
);
$cle = $this->table_om_utilisateur_field_login."='".$login."'";
@@ -6355,9 +6349,6 @@
$class = "error";
$message = __("Nouveau mot de passe incorrect");
$this->displayMessage($class, $message);
- } elseif (OM_PASSWORD_ALGO === PASSWORD_BCRYPT && strlen($new_password) > 72) {
- // bcrypt tronque silencieusement à 72 octets : on rejette explicitement
- $this->displayMessage('error', __("Le mot de passe ne peut dépasser 72 octets avec la méthode de stockage actuelle. Veuillez choisir un mot de passe plus court."));
} else {
// Changement du mot de passe
$this->changeDatabaseUserPassword($_SESSION['login'], $new_password);
@@ -6400,15 +6391,11 @@
$form->setType("new-password-confirmation", "password");
$form->setTaille("new-password-confirmation", 20);
//
- // bcrypt tronque silencieusement à 72 octets : on limite le champ HTML en conséquence.
- // Pour les autres algorithmes (argon2id, etc.), aucune limite n'est imposée.
+ // Aucune limite de longueur de mot de passe, ils sont hachés avec password_hash et PASSWORD_ARGON2ID
+ // et rentrerons donc dans le champ prévu en base de données quelque soit leur longueur initiale
$form->setMax('current-password', null);
$form->setMax('new-password', null);
$form->setMax('new-password-confirmation', null);
- if (OM_PASSWORD_ALGO === PASSWORD_BCRYPT) {
- $form->setMax("new-password", 72);
- $form->setMax("new-password-confirmation", 72);
- }
//
$form->entete();
$form->afficher($champs, $validation, false, false);

Reply all
Reply to author
Forward
0 new messages