Archive | janvier 15th, 2021

Playing with bcrypt and Joomla

Juste pour poser là quelques détails sur le stockage sécurisé des mots de passe dans Joomla (cms php très courant).

Bref un truc avec lequel on joue un peu en TP, mais qui est aussi parfois bien utile quand on a perdu le mot de passe de l’unique compte d’administration du site (n’est-ce pas la Mairie de N….?, vieille mission Alliacom en 2010).

Si je jette un œil sur le contenu de ma table des utilisateurs Joomla, j’aperçois ce genre de chaînes de caractères dans les champs password :

$2y$10$OL0ibA8TKT.287zm4HPkYuKI/5CH0X1bMe9PyxPRjOxjeCSC/FOwm

On notera par ailleurs qu 2 utilisateurs avec le même mot de passe présenteront un hash différent, bref on est loin du pauvre MD5 sans sel utilisé il y a quelques années par Joomla.

On reconnaît un hash bcrypt par la présence en début de chaîne de  $2y dans ‘$2y$10$’, le $10 est le coût algorithmique, autrement dit 210 = 1 024 itérations.

Les 22 caractères suivants constituent le sel aléatoire. Les caractères qui complètent la chaîne composent le mot de passe hasché. Comme un petit schéma vaut mieux qu’un long discours :

brcypt

brcypt selon wikipedia

Pour plus de détails (tout public) sur bcrypt  : https://www.bcrypt.fr/questions

Et pour aller plus loin dans la compréhension : https://auth0.com/blog/hashing-in-action-understanding-bcrypt/

Et enfin pour faire quelques tests en ligne : https://bcrypt-generator.com/

La fonction crypt en php, fonctionne donc comme cela :

crypt($motdepasse, '$2y$10$'.randombytes(22));
playing with bcrypt and Joomla

playing with bcrypt and Joomla

http://micmap.org/php-by-example/man…ion.crypt.html

Exemple : password (très mauvaise idée de mot de passe)

$2y$10$.prE1BkZ87aPNnsKMTOSxe9pv8TQIhfBb2HZpSnBPfh.LeHgnaLD2

 

Cette fonction est par exemple utilisée dans Joomla la classe/méthdoe JUserHelper::hashPassword pour Joomla. Après étude, il est ainsi relativement simple de créer un fichier joomla-password-hash.php et de le placer à la racine de son site.

<?php
define(‘_JEXEC’, 1);
define(‘JPATH_BASE’, dirname(__FILE__));
require_once(JPATH_BASE . ‘/includes/defines.php’);
require_once(JPATH_BASE . ‘/includes/framework.php’);
echo « <strong>Password: </strong> » . JUserHelper::hashPassword(‘password’);

?>
https://api.joomla.org/cms-3/classes/JUserHelper.html

En résumé, le nombre d’itérations implique un calcul plus long et plus fastidieux pour les scripts de hacks et même si la base de données était piratée, cela me semble un peu plus difficile de retrouver le mot de passe… comme ce fut le cas l’année dernière pour dailymotion (ce service de video utilisent bcrypt également) : https://www.information-security.fr/…didentifiants/

L’implémentation d bcrypt a donné un peu plus de sécurité à Joomla, cela n’empêche pas d’imposer un minimum de caractères, mélange min/maj, caractères spéciaux aux mots de passe pour fonctionner un peu plus efficacement. Il faut éviter par exemple que les utilisateurs utilisent uniquement leur date d’anniversaire pour le mot de passe … (chercher « paradoxe des anniversaires » dans un moteur de recherche si vous aimez les probabilités )…

De plus, il y a aujourd’hui un marché de solutions complémentaires à connaître : MFA, double authentification (google authenticator et dérivé), sans mot de passe comme launchkey.com, par sms avec accountkit de facebook…

Posted in Boulot, Clic1 Commentaire