nathan...@users.adullact.net
unread,Feb 27, 2026, 11:38:59 AM (6 days ago) Feb 27Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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);