Annonce

Écrire une réponse

Veuillez écrire votre message et l'envoyer

Cliquez dans la zone sombre de l'image pour envoyer votre message.

Retour

Résumé de la discussion (messages les plus récents en premier)

plg
2012-10-17 10:25:37

J'ai eu l'occasion de bosser hier sur le domaine du hashage des mots de passe. Ma conclusion c'est d'utiliser phpass pour Piwigo 2.5, avec conversion progressive et automatique des mots de passe actuellement en md5.

phpass propose de faire du blowfish avec salt automatique, mais pour une meilleure compatibilité avec les versions de PHP antérieures à la 5.3, il propose une option de $portable_hashes qui se résume à faire des itérations de md5 + salt.

phpass est utilisé par WordPress, Drupal, phpBB...

lildadou
2012-10-15 09:50:38

Bonjour à tous,
probablement depuis la mise à jour de PHP, la méthode donnée si dessous ne fonctionne plus et introduit une vulnérabilité grave : un attaquant peut se loguer uniquement avec le login (tout les mots de passe sont acceptés). Le problème est du à une mauvaise utilisation des double-quote mais n'existait pas quand j'ai rédigé ce post.

Plus ennuyeux, le code avec les caractère correctement échappé ne fonctionne pas non plus:

Code:

$conf['pass_convert'] = create_function('$s', 'return crypt($s, \'$2a$12$T9sWUQ03RRG6oSwtDvJtyn$\');');

Alors qu'il fonctionne très bien en console:

Code:

<?php
$lol=create_function('$s', 'return crypt($s, \'$2a$12$T9sWUQ03RRG6oSwtDvJtyn$\');');
echo $lol('prout')."\n";
echo crypt('prout', '$2a$12$T9sWUQ03RRG6oSwtDvJtyn$');
?>
$2a$12$T9sWUQ03RRG6oSwtDvJtyeVMo73pP8Ry0HCUsIFidDkIrW/oUtp3q
$2a$12$T9sWUQ03RRG6oSwtDvJtyeVMo73pP8Ry0HCUsIFidDkIrW/oUtp3q

PS: Woula! En dumpant la BDD je me rend compte que la solution n'a jamais fonctionné! Et je suis incapable de dire pourquoi!

PS2: J'ai finalement trouvé ; c'est la taille du champ password qui cause problème!

Code:

DESCRIBE piwigo_users;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | smallint(5)  | NO   | PRI | NULL    | auto_increment |
| username     | varchar(100) | NO   | UNI |         |                |
| password     | varchar(32)  | YES  |     | NULL    |                |
| mail_address | varchar(255) | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

En cherchant de la doc, j'ai aussi découvert que md5, sha1 ou même sha512 sont des fonctions de hashage qui ne doivent pas être utilisées pour chiffrer des mots de passe! Car si elle empêche de trouver un pass depuis son hash, seules, elles n'empêchent pas une attaque par bruteforce (car elles sont très rapides à calculer). C'est d'ailleurs pour cela que PHP propose hash() et crypt(). hash() est le hashage normal, crypt effectue le même hashage... 5000 fois de suite.

Bref, j'ai trouvé et corrigé mon problème. J'enlève l'ALERT et je corrige le premier post.

mistic100
2012-09-14 12:27:17

au pire si on choisit un autre algo qui fait aussi 32 chars on peut cheater en ajoutant un 0 à la fin de tous les nouveaux mots de passe

plg
2012-09-14 09:27:47

flop25 a écrit:

Oui tout à fait.
Mais le problème est la retro compatibilité

Justement, j'ai pensé à un truc...

Pour regénérer les mots de passe, il faut qu'on ait le mot de passe en clair. Il n'y a qu'un seul moment où Piwigo a ce mot de passe en clair : lors de l'identification. On pourrait, au moment de l'identification, mettre à jour le hash du mot de passe en base.

Ensuite comment différencier un mot de passe qui a déjà été mis à jour et un mot de passe encore en MD5 ? Avec la longueur de la chaîne hashée. Un mot de passe hashé en MD5 fait 32 charactères (0-9a-f). Selon l'algorithme choisi, un mot de passe hashé fera davantage.

Je n'ai pas poussé l'étude, mais il faut choisir l'algorithme de hashage judicieusement car certains nécessitent une version récente de PHP (comme $2x$ ou $2y$ proposés ci-dessus, qui nécessitent PHP 5.3.7 !). L'autre point important, c'est qu'il faut que l'algo retourne le même résultat quelque soit la machine sur laquelle il est exécuté : on doit pouvoir déménager son Piwigo facilement d'un hébergeur à l'autre sans devoir réinitialiser tous les mots de passe.

flop25
2012-09-14 08:44:43

Oui tout à fait.
Mais le problème est la retro compatibilité

mistic100
2012-09-14 01:04:33

si je ne me trompe pas on a $conf['secret_key'] qui est généré à l'installation, on peut aussi l'utiliser comme sel (ça permet d'être sur d'avoir un truc aléatoire)

ddtddt
2012-08-19 23:44:38

Attention à ceux qui utilise une identification commune avec d'autre applis ;-)

flop25
2012-08-14 19:23:37

Merci
j'y ai pensé aussi mais le problème est la maj ! Il faut renvoyer un mail à tous les utilisateurs ou mettre une procédure de maj du mpd à la connexion : dans les deux cas il faut garder une trace de l'identification d'avant
Mais n'hésitez pas à créer un ticket Mantis et à continuer à aider ;) http://piwigo.org/bugs/

lildadou
2012-08-11 01:09:06

(re-)bonsoir,
Je voudrais vous faire part d'une amélioration significative de la protection des mots de passes avec une modification triviale à réaliser pour peu que c'est une installation fraiche (tout les anciens mot de passes sont perdus).
Source: http://www.php.net/manual/fr/faq.passwo … s.fasthash

Avant de commencer vous allez devoir modifier la structure de la table "users" pour qu'elle accepte des valeurs de mot de passe plus élevée.

Code:

ALTER TABLE piwigo_users MODIFY password varchar(255);

Maintenant nous allons créer un "grain de sel" avec un petit jeu:
- choisissez un nombre entre 04 et 31 (sur 2 digit le nombre)
- choisissez un 22 caractère parmi a à z, A à Z et 0 à 9 ([a-z][A-Z][0-0]{22})

Votre sel est $2y$+réponse1+$+réponse1+$
Ex: "$2y$12$T9sWUQ03RRG6oSwtDvJtyn$"

Éditez votre fichier de config et remplacer la ligne

Code:

$conf['pass_convert'] = create_function('$s', 'return md5($s);');

par (mettez votre sel à la place)

Code:

$conf['pass_convert'] = create_function('$s', 'return crypt($s, \'$2y$12$T9sWUQ03RRG6oSwtDvJtyn\');');

Changer votre mot de passe avant de vous déconnecter.

Edit:
- correction simple/double-quote
- utilisation de l'algo 2y (http://www.php.net/security/crypt_blowfish.php)

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact