Crypter les mots de passe dans une base de données.

Comment crypter les mots de passe dans une base de données ?

Par sécurité, il est une bonne pratique qui consiste à crypter les mots de passe stockés dans une table de votre base de données. Ainsi, dans le cas ou une personne malveillante arriverait à consulter votre table, elle ne pourrait pas voir le mot de passe, mais une suite de caractères dépourvue de sens.

Comment stocker ces mots de passe cryptés?

Première étape : créer la table

Nous allons utiliser phpMyAdmin. Dans une base de données, créons une table ‘tableTest’ de 3 champs :

Création d'une table de 3 champs

définir les type de champs de la table

Notez que selon le nombre de champs, ce nouveau formulaire peut être horizontal

Remplissons le formulaire avec ces valeurs par colonne)

Création de l'id autoincrement primary

  • Le premier champ sera notre identifiant, nommons le id
  • Conserver le type INT (pour integer : entier)
  • Cocher la case A_I pour appliquer la contrainte Auto incrément (cela peut être dans une liste déroulante nommée Extrra) à ce champ
  • Appliquer l’index PRIMARY pour faire de ce champ une clé primaire (cela peut être un bouton radio sous une icône en forme de clé)

Création du champ login unique

  • Le second champ contiendra le login, nommons le login
  • Choisir VARCHAR (pour donner un type chaine de caractère)
  • Indiquer la valeur ‘10‘ pour la longueur de ce champ
  • Appliquer l’index UNIQUE pour imposer l’unicité de ce champ (pas deux fois le même login dans la table)(cela peut être un bouton radio sous une icône avec un U)

Création du champ passord

  • Le troisième et dernier champ stockera le mot de passe crypté, nommons le password
  • Choisir VARCHAR (pour donner un type chaine de caractère)
  • Indiquer la valeur ‘50‘ pour la longueur de ce champ (cette fois la longueur doit tenir compte du fait que le cryptage allonge considérablement les textes

Deux réglages enfin.

Réglage de paramètres

Réglages de paramètres

  • Modifier le champ login pour le rendre sensible à la casse en choisissant utf8_bin pour son interclassement (Pour que le login toto soit différent du login TOTO)
  • Modifier le moteur de stockage de la table pour le passer en InnoDB (et bénéficier des dernières performances de MySQL

Valider pour enregistrer la table en cliquant sur le bouton Sauvegarder

la table est crée

Seconde étape : Entrer des données

Vous devez accéder à votre table. Si elle n’est pas affichée dans la partie droite, cliquez sur son nom dans la zone de gauche. Ensuite, pour pouvoir ajouter des données (= ajouter des enregistrements, = insérer des tuples…), cliquez sur le bouton Insérer du menu supérieur

Insertion de données dans une table

Insertion de données dans une table

Un formulaire double s’affiche pour entrer les données. Il suffit d’entrer vos textes (dans le ou les formulaires) :

  • La première ligne de chaque formulaire est dans notre cas (souvent) réservée au champs auto incrément, on la laisse intacte
  • La première colonne est réservée aux fonctions, on y intervient que rarement. (Mais nous le ferons dans le cas de notre cryptage)
  • Nous entrons donc le login dans le champ valeur (par exemple Jérôme)
  • Nous entrons le pass dans le champ valeur (par exemple toto)
  • IL FAUT UTILISER UNE FONCTION DE CRYPTAGE POUR CE MOT DE PASSE: PRENONS PASSWORD
  • Cliquez sur le bouton Exécuter pur insérer ces données

Notez que nous aurions pu choisir un autre type de cryptage dans la liste des fonctions : MD5, SHA1…. Nous aurions également pu entrer deux enregistrements dans la table en utilisant les deux formulaires disponibles

Insertion de données cryptées dans la table

Insertion de données cryptées dans la table

Le système phpMyAdmin nous indique que l’enregistrement a été inséré dans la table. En cliquant sur le bouton Afficher vous pourrez consulter vos données et vérifier que le mot de passe est bien crypté.

Le mot de passe a bien été crypté

Le mot de passe a bien été crypté

Dernière étape tester les données en php/SQL

Plaçons nous dans le cas d’un formulaire post avec deux champs ‘login’ et ‘pass’. A la validation du formulaire, les données sont réceptionnées dans une page de validation. Voyons un bref code testant les identifiants dans notre table.

Attention, les données ne doivent JAMAIS êtres directement utilisées dans un script sur la base de données.

Les injections SQL consistent à injecter des portions de codes dans nos requêtes SQL en utilisant les formulaires ou les liens de nos sites. Il est impératif d’utiliser une procédure pour tester et nettoyer les variables à la réception !

Ces fonctions doivent être utilisées systématiquement :

//Reception des données
$login = isset($_POST['login']) ? mysql_real_escape_string($_POST['login']) : '';
$pass= isset($_POST['pass']) ? mysql_real_escape_string($_POST['pass']) : '';

//Ecriture de la requete
$query = "SELECT * FROM tableTest
WHERE login='$login'
AND
pass =PASSWORD('$pass')";

Une fois les données du formulaire réceptionnées (lignes 2 et 3), la requête SQL cherche les enregistrements de la table tableTest OU le contenu du champ login est identique au contenu de la variable $login (ligne 7) ET le contenu du champ pass est identique au cryptage par la fonction SQL PASSWORD().
En effet, si le visiteur entre toto dans le formulaire d’entrée, il faut crypter cette valeur ‘toto’ pour la comparer avec le contenue de la table, qui lui est crypté ! (ligne 9)

Tags: ,
Posted in SQL / Mysql | Comments (10)

10 Responses to “Crypter les mots de passe dans une base de données.”

  1. Josue store et outillage 81 Says:

    Votre site m’a été d’une grande aide pour mieux comprendre la situation. Merci

  2. Beno Says:

    Salut,

    Merci bien pour ce petit article clair et concis.
    Ca m’a bien aidé !

  3. Jérôme Desbordes Says:

    Merci de votre passage et de votre retour

  4. Al Says:

    Tuto sympa mais incomplet je pense. Je m’explique :
    Que ce passe-t-il lors de l’envoie des données d’authentification au serveur (qui traite cette page php) ? En effet dans le cas de ce tuto, le serveur reçoit le mot de passe non crypté (qu’il devra crypté lui-même par la suite pour comparer). Le mot de passe reste donc une donnée sensible lors de son acheminement vers le serveur (snif du réseau, man in the middle, …)

    Une meilleure réponse serait donc bien de stocker le mot de passe crypté dans la base de données, mais aussi de le crypter avant de l’envoyer au serveur et non dans la requête SQL une fois les données reçues.

  5. Jérôme Desbordes Says:

    Bonjour,
    Oui sur le principe un cryptage pourrait ce faire avant l’envoi du pass sur le réseau. Les technique employées dépasseraient alors le cadre du php. Java ou un autre langage client. dans ce cas je préconiserai plutôt une connexion sécurisée.
    Merci de ce retour

  6. el savoy Says:

    comment inserer les password cryptes avec avec du php?

  7. Jérôme Desbordes Says:

    Bonjour,
    Le php sera utilisé pour accéder à la base de données et lui transmettre une requête SQL. C’est cette requête qui cryptera les mot de passe comme cela pour une insertion :
    INSERT INTO tableTest (login, pass) VALUES ($login, PASSWORD(‘$pass’))

    Sinon il existe la fonction php crypt : http://php.net/manual/fr/function.crypt.php

  8. Roland Says:

    Bonjour,
    Pour ma part, je crée une méthode dans mon objet de gestion des utilisateurs qui me génére un hash d’une chaine envoyée, avec un « grain de sel ».
    Exemple : function hashPass($pass){ return md5(‘1234567890’ . $pass . ‘1234567890’; }
    Dans mes requêtes de création/modification du mot de passe et de vérification des identifiant/mot de passe fournis, je passe par cette fonction… SELECT * FROM tableTest WHERE login = $login AND pass = hashPass($pass)
    Bien sûr, ce n’est qu’un exemple et il faut penser à mettre en forme correctement la requête avec les variables php… et PDO::quote() par exemple…

  9. mioux Says:

    Grosse erreur que de mettre ce $login et ce $pass comme ça dans la requête…

    Et si je mets comme login :
    admin’ or ‘1’ = ‘
    ?

    On a la requête suivante qui s’exécute :

    SELECT * FROM tableTest
    WHERE login=’admin’ or ‘1’ =  »
    AND
    pass =PASSWORD( »)

    Hop, je suis logué en tant qu’admin…

    Ne JAMAIS passer de variables qui sont potentiellement modifiables par un utilisateur dans une requête sans la protéger…

  10. Jérôme Desbordes Says:

    Oui ce petit tuto ne traite pas des injections SQL, je corrige de suite

Leave a Reply

*

 
#JeSuisCharlie