Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Gérer correctement les mots de passe dans un site web lié à Mercator

0000002274     -      24/06/2016

Très fréquemment, les mots de passe sont stockés "en clair" dans la table CLI de Mercator. Déontologiquement, pour un concepteur de site web, ceci n'est pas correct. En effet, beaucoup d'internautes utilisent le même mot de passe sur différents sites et il n’est dès lors pas normal que quiconque dispose de cette information. 

Pour remédier à cela, il est classique de mémoriser une clé SHA1 des mots de passe et non les mots de passe "en clair". Pour rendre le système plus robuste, la clé SHA1 sera calculée sur base de la concaténation d’une chaîne fixe et du mot de passe de l’utilisateur. (Dans nottre exemple la chaîne fixe est "coucou_gamin".)

Pour mettre cela en place quand les mots de passe sont déjà présents dans la base de données (par exemple, dans le champ C_PWD), il suffit de :

  • veiller à ce que le champ C_PWD puisse recevoir 40 caractères. Au besoin, augmenter la taille du champ.
  • exécuter cette requête : update CLI set c_pwd=dbo.xsha1('coucou_gamin'+c_pwd) where c_pwd<>''

Dans le site, si on vérifie le compte utilisateur par une requête SQL, il suffit de l'adapter comme suit :

select ... from CLI where ... and (c_pwd=dbo.xsha1('coucou_gamin'+@pwd))

où @pwd est le mot de passe encodé par l'utilisateur.

Dans l'interface de Mercator, il est utile de prévoir un bouton permettant de changer le mot de passe de l'utilisateur ou de l'initialiser avec une valeur aléatoire. Ceci peut être réalisé avec le customizer suivant :

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using MercatorUi;
using MercatorApi;

namespace SigCli
{
    public class Customizer : MercatorUi.ICustomizers.IFormLoadCustomizer, MercatorUi.ICustomizers.IFormClosedCustomizer, MercatorUi.ICustomizers.IFormValidateCustomizer
    {

        public void FormLoadCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)form;

            MercatorUi.MovableControls.MovableTextBox textBoxPwd = (MercatorUi.MovableControls.MovableTextBox)sigForm.MovableControls["..."]; // ... = id du textbox mot de passe
            textBoxPwd.ButtonCustom.Visible = true;
            textBoxPwd.ButtonCustomClick += new EventHandler(textBoxPwd_ButtonCustomClick);
        }

        
        public void FormClosedCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)form;
            MercatorUi.MovableControls.MovableTextBox textBoxPwd = (MercatorUi.MovableControls.MovableTextBox)sigForm.MovableControls["..."]; // ... = id du textbox mot de passe
            textBoxPwd.ButtonCustomClick -= new EventHandler(textBoxPwd_ButtonCustomClick);
        }

        
        void textBoxPwd_ButtonCustomClick(object sender, EventArgs e)
        {
            MercatorUi.MovableControls.MovableTextBox textBox = (MercatorUi.MovableControls.MovableTextBox)sender;
            if (textBox.Text.Trim() == "")
            {
                string pwd = Api.Ident();
                textBox.Text = Api.Xsha1("coucou_gamin" + pwd);
                MercatorUi.Dialogs.Stop(string.Format("Le mot de passe généré est \"{0}\" et a été copié vers les presse-papier.", pwd));
                try
                {
                    Clipboard.SetData(DataFormats.Text, pwd);
                }
                catch (Exception ex)
                {
                    MercatorUi.Dialogs.Stop(ex.Message);
                }
            }
            else
            {
                string pwd = MercatorUi.Dialogs.AskString("Remplacer le mot de passe actuel par ... ?", "").Trim();
                if (pwd != "")
                    textBox.Text = Api.Xsha1("coucou_gamin" + pwd);
            }
        }

    }
}