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
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é.
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 :
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 ».
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.
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.
ou, plus simplement :
$hash = password_hash($motDePasseEnClair);
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.
Lorsqu'un usager souhaite s'authentifier, le programme doit :
ou, plus simplement :
$ok = password_verify($motDePasseEnClair, $motDePasseBD);
« 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/
Site fièrement hébergé chez A2 Hosting.