Encryptage et sécurisation des données en PHP

Publié le 4 septembre 2012 - Developpement Web. Tags : , , ,

md5, bcrypt, sha-2, PBKDF2, scryptAujourd’hui, focus sur l’encryptage des données dans un site internet. Si les besoins en matière de sécurité diffèrent selon les sites, la thématique reste au cœur de toutes les préoccupations, dès le moment où vous enregistrez et manipulez des données personnelles.

Il ne serait pas trop exagéré de dire que 90% des sites (hors plateformes utilisant WordPress, phpBB, etc.) utilisent toujours la fonction md5() fournie par PHP pour encoder les mots de passe en base. Si cela reste des forcément mieux que la technique inconsciente consistant à ne rien encoder du tout, ce qui pouvait servir de bonne pratique il y a 10 ans, ne convient plus en 2012. En effet, il suffit de 40 secondes à un serveur moderne (beaucoup moins pour les machines plus puissantes) pour cracker un mot de passe de 6 caractères alphanumériques ayant une empreinte (hash) md5…

Il va s’en dire que les parades consistant à ajouter une clé aléatoire (sel, ou salt en anglais) lors de la création du hash ne servent plus à grand chose non plus contre les attaques de force brute / dictionnaires, tant la puissance des machines augmente avec le temps. Les plus malins sont sans doute déjà passé à l’algorithme  sha-1, pensant que cela se révèlerait plus efficace, mais la triste vérité est que cela ne change pas grand chose. Ces méthodes sont même officiellement obsolètes (lire : le md5 craqué et sha-1 non-sûr).

Concrètement, ces fonctions de hashage on été optimisées afin d’êtres faciles à utiliser et efficaces. La conséquence est qu’elles sont de la même façon plus faciles et simples à cracker.

Partant de cette analyse, il vous reste reste grosso modo 3 choix :

  1. Passer plusieurs fois vos mots de passe  à la moulinette md5 avec un salt complexe (à éviter),
  2. Utiliser SHA-2 avec un salt complexe (pour le moment sûr, mais jusqu’à quand ?),
  3. Utiliser un nouvel algorithme d’encryptage.

Il y aurait beaucoup à expliquer sur le sujet, si vous voulez en savoir plus, voici une très bonne introduction (Anglais).

Ici nous allons nous intéresser à la principale solution alternative du moment (façon de parler… bcrypt ayant été présenté pour la première fois en 1999) : bcrypt.

Basé sur l’algorithme de chiffrement symétrique Blowfish,  bcrypt introduit un paramètre (le « work factor »), vous permettant de définir le niveau de sécurité souhaité. A ce jour, avec les paramètres de base , il faut compter 12 ans pour craquer un mot de passe encrypté avec Bcrypt, contre 40 secondes avec le md5. (d’ailleurs bcrypt n’a jamais été craqué).

La contre partie de cette sécurité accrue est un temps de cryptage forcément plus long. Aussi, si ce niveau de sécurité est trop fort pour vos besoins, vous pouvez diminuer le work factor en conséquence. De la même façon, il vous suffit d’augmenter ce même paramètre pour adapter votre niveau d’encryptage aux évolutions des capacités de calculs des machines à venir. En résumé, bcrypt est compatible avec la loi de Moore, ce qui en fait un parfait allié de long terme.

Après soyons honnête, vos mots de passe n’ont sans doute pas besoin de ce genre de sécurité,  et vous pourriez avoir besoin d’un algorithme plus rapide comparaison; mais bcrypt vous permettant de choisir votre propre rapport entre vitesse et sécurité… utilisez-le !

Comment passer de md5 à bcrypt ?

Vous n’avez pas 36 solutions : à moins brut-forcer vous-même les hash md5 stockés dans votre base ou de réinitialiser de façon automatique tous les mots de passes de vos membres,  vous devez attendre que vos utilisateurs se connectent à nouveau sur votre site. C’est la seule façon de récupérer simplement le texte non hashé afin de l’encrypter avec l’algorithme de chiffrement de votre choix. En clair, vous devez créer un nouveau champ VARCHAR (40), afin de mettre à jour les mots de passes de vos membres au format bcrypt, tout en conservant le champ contenant les empreintes md5. Lors des connexions réussies utilisant l’ancien format (md5), vous cryptez alors les mots de passe correspondants dans le nouveau format. Une fois un mot de passe à jour (le nouveau champ n’est plus vide…), vous validez les nouvelles connexions en utilisant les nouvelles données cryptées.

Pour crypter les mots de passe au nouveau format, il suffit d’inclure le framework sur les pages nécessitant une authentification, de créer une nouvelle instance de PasswordHash et d’appeler la méthode HashPassword(), de cette façon :

include('phpass/PasswordHash.php');
$pwd_hash = new PasswordHash(8, FALSE);
$passwd = $pwd_hash->HashPassword($login_passwd);

Solutions d’encryptage alternatives

Scrypt

L’une des principales alternatives du moment se nomme scrypt, une fonction de dérivation de clés crée par Colin Percival en 2009, et destinée à combler les lacunes de bcrypt. En clair, il s’agit d’un bcrypt nouvelle génération, adaptée aux technologies du moment, destiné à contrer les attaques utilisant le composant électronique FPGA (pour ce faire, scrypt utilise plus RAM). Si la solution tend à être de plus en plus recommandée, elle n’en reste pas moins assez jeune (3 ans), et de fait n’est pas encore adoptée à grande échelle. A suivre.

PBKDF2

Solution recommandée par le NIST (National Institute of Standards and Technology – USA) et utilisée par les principaux services de sécurisation/conservation de mots de passe comme 1Password, LastPass, etc. Même si PBKDF2 ne fait pas l’unanimité, cette solution est définie comme « probablement » la plus sécurisée du moment, en raison du fait qu’elle ait été beaucoup plus testée et analysée que ses concurrentes.

 

Conclusion

Vous l’aurez compris, j’utilise en ce qui me concerne l’algorithme d’encryptage par dérivation de clés bcrypt, en raison de sa simplicité d’utilisation/implémentation et du niveau de sécurité fournit.

Gardez à l’esprit  que cet article vous présente les bonnes pratiques actuelles en matière de chiffrement des données, on part donc du principe où le pirate a un accès total à votre site (base de données et code source). Pour tous les autres cas (attaques en brute force), une empreinte md5 avec un grain de sel bien placé reste quasi-impossible à décoder à partir du moment ou vous avez prit des mesures basiques (mot de passe de  6-8 caractères alphanumériques + caractères spéciaux minimum, blocage du formulaire de connexion à partir X échecs, etc).


Articles sur ce thème :
Aucun article lié.