Formation PUB010 : PHP, 2022 Sécuriser le code

21.12 Cryptage, hachage, salage : comment mieux protéger les données sensibles dans une BD


Quand vient le temps de protéger des informations sensibles stockées dans une base de données, comme les mots de passe, on utilisera les termes cryptage, hachage (en anglais : hash) et salage (en anglais : salt).

Afin de comprendre comment bien protéger nos informations, voyons ce que signifient ces termes.

▼Publicité Le texte se poursuit plus bas

Cryptage

Antidote définit le cryptage comme suit :

Transformation d’un message en message codé incompréhensible pour qui ne connaît pas le code, de façon à en protéger la confidentialité ou l’authenticité.

La particularité du cryptage, c'est que le message crypté peut être décrypté. Pour lire le message, il faut avoir la clé permettant de lui redonner sa forme originale.

Généralement, les informations sensibles stockées dans une base de données ne peuvent pas être décryptées. Elles n'ont donc pas été cryptées. Pourtant, l'expression cryptage est tellement répandue qu'elle est généralement acceptée pour parler de la protection que l'on applique aux informations stockées dans une BD et ce, même si aucun cryptage n'est effectivement réalisé.

Hachage

Selon Antidote, le hachage est une

opération consistant à transformer un message de taille variable en un code de taille fixe en appliquant une fonction mathématique dans le but d’authentifier ou de stocker ce message

Autrement dit, le hachage est une technique qui transforme une chaîne à l'aide d'un algorithme mathématique. La chaîne ainsi transformée ne sera pas compréhensible. Et contrairement à une chaîne cryptée, une chaîne ayant subi un hachage ne pourra pas être décodée. 

Prenons l'exemple d'un mot de passe. Aucun programme ne devrait stocker un mot de passe en clair. La technique utilisée sera de transformer le mot de passe à l'aide d'un algorithme de hachage avant de le stocker. Lorsqu'un usager tentera de s'authentifier, le mot de passe saisi sera lui aussi transformé à l'aide du même algorithme avant d'être comparé au mot de passe stocké dans la BD.

Parmi les algorithmes de hachage les plus connus, mentionnons MD5, SHA1 et SHA256. Mais attention : ces algorithmes utilisés seuls ne sont pas sécuritaires (voir plus bas).

Il est parfois possible d'appliquer le hachage à l'aide du système de gestion de base de données.

En MySQL, on a :

Parfois, c'est du côté du langage de programmation que la conversion aura lieu. Par exemple :

En PHP, on a :

Le problème avec la technique du hachage utilisée seule, c'est qu'un pirate informatique pourrait réussir à retrouver le mot de passe original à l'aide de différentes techniques.

Parmi ces techniques, notons :

  • Par force brute : le pirate appliquera un algorithme de hachage à différentes combinaisons de caractères afin de comparer le résultat avec l'information stockée dans la base de données. Son travail sera facilité s'il détient un dictionnaire de mots de passe potentiels, qui contient généralement les mots du dictionnaire, des mots de passes formés à partir de différentes informations personnelles de l'usager, de même que des mots de passe souvent utilisés. Il existe de nombreux dictionnaires, dont le très connu Rock you, qui sont en fait d'énormes fichiers texte contenant des milliers de mots de passe possibles.
  • À l'aide d'une base de données contenant une quantité importante de mots de passe déjà transformés.On appellera cette base de données table de correspondance ou, en anglais, lookup table. Il existe sur Internet des tables de correspondance contenant des milliards d'enregistrements. Des pirates ont trouvé une façon efficace de bonifier une telle base de données en publiant des sites Web dont le but présumé est de vous indiquer la sécurité de votre mot de passe. En saisissant votre mot de passe sur de tels sites, vous ajoutez des entrées dans leur table de correspondance. Ouch !

Plus le mot de passe sera long et comprendra des caractères variés (lettres majuscules et minuscules, chiffres, caractères spéciaux), plus le travail du pirate sera long. Cependant, s'il a accès à un réseau d'ordinateurs travaillant de pair, il réussira à effectuer des milliards de comparaisons et finira tôt ou tard par trouver le mot de passe.

Selon Jean-François Pillou et Jean-Philippe Bay, dans leur livre « Tout sur la sécurité informatique » aux éditions DUNOD, « la conclusion d’une étude sur le coût d’une recherche de mot de passe via les possibilités offertes par les services de cloud computing porte à 10 le nombre de caractères qu’un mot de passe doit aujourd’hui comporter pour que le coût de sa recherche devienne vraiment un frein ».

Salage

Saler un mot de passe consiste à lui concaténer une chaîne de caractères avant de lui appliquer un algorithme de hachage. Pour que la technique soit efficace, il faut que chaque usager ait sa propre clé de salage, que cette clé soit générée aléatoirement et qu'elle soit aussi longue que possible. 

La clé de salage sera généralement stockée dans la base de données.

MySQL offre la fonction UUID() qui peut être utilisée pour générer une clé de salage. La clé générée avec UUID() n'est pas complètement imprévisible. Elle est cependant suffisamment aléatoire pour offrir le niveau de sécurité espéré.

En PHP, l'utilisation de password_hash() est très intéressante puisqu'elle génère une clé de salage qui fait partie intégrante du résultat du hachage.

Processus de stockage du mot de passe

Voici donc le processus à suivre pour stocker un mot de passe de façon sécuritaire dans la base de données.

Il faut s'assurer que le champ du mot de passe soit assez long pour stocker le mot de passe sécurisé. Avec password_hash() et l'algorithme bcrypt, il doit avoir 60 caractères.

  1. Récupérer le mot de passe en clair entré dans le formulaire d'inscription;
  2. Générer une clé de salage;
  3. Bonifier le mot de passe en clair en lui concaténant la clé de salage;
  4. Appliquer l'algorithme de hachage au mot de passe bonifié;
  5. Stocker le mot de passe sécurisé et la clé de salage dans la base de données.

ou, plus simplement :

  1. Récupérer le mot de passe en clair entré dans le formulaire d'inscription;
  2. Appliquer la fonction password_hash() au mot de passe en clair;
    PHP

    $hash = password_hash($motDePasseEnClair);

  3. Stocker le mot de passe sécurisé dans la base de données (grâche à password_hash(), la clé de salage est incluse dans le résultat du hachage).

Si vous devez créer des usagers « à bras » en entrant des informations manuellement dans la base de données, vous pouvez obtenir un mot de passe salé et haché à l'aide de ce petit outil : https://apical.xyz/pages/formulairebcrypt.

Processus de comparaison

Lorsqu'un usager souhaite s'authentifier, le programme doit :

  1. Récupérer le mot de passe salé et haché dans la base de données;
  2. Récupérer la clé de salage correspondant au login de l'usager dans la base de données;
  3. Concaténer la clé de salage au mot de passe en clair;
  4. Appliquer l'algorithme de hachage au mot de passe bonifié;
  5. Comparer le résultat avec le mot de passe de l'usager dans la base de donnée.

ou, plus simplement :

  1. Récupérer le mot de passe salé et haché dans la base de données;
  2. Appliquer la fonction password_verify() pour vérifier si le mot de passe en clair correspond à celui de la base de donnée.
    PHP

    $ok = password_verify($motDePasseEnClair, $motDePasseBD);

Pour plus d'information

« 12.13 Encryption and Compression Functions ». MySQL. http://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html

« Sécuriser un mot de passe en base de données ». Crazy WS. http://www.crazyws.fr/tutos/securiser-un-mot-de-passe-en-base-de-donnees-BEKIC.html

« Hachage n’est pas cryptage ! De la sécurité des données chiffrées dans les SGBDR ». Le blog de SQLpro. http://blog.developpez.com/sqlpro/p12496/langage-sql-norme/hachage-nest-pas-cryptage-de-la-securite-des-donnees-chiffrees-dans-les-sgbdr

« Add a Salt with the SQL Server HASHBYTES Function ». MS SQL tips. http://www.mssqltips.com/sqlservertip/3293/add-a-salt-with-the-sql-server-hashbytes-function/

« Salting SHA in MySQL ». One Last Bit. http://onelastbit.com/?p=138

« Safe Password Hashing  ». PHP. http://php.net/manual/en/faq.passwords.php

« Why do you need to Salt and Hash passwords? ». Culttt. https://www.culttt.com/2013/01/21/why-do-you-need-to-salt-and-hash-passwords/

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Par Christiane Lagacé
Dernière révision le 30 mars 2023
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre