Pour rappel:
- Le hachage est réputé inviolable mais irréversible ce qui peut être gênant pour renvoyer un mot de passe oublié par exemple. PHP offre deux fonctions de hachage: md5() sha1().
- Le cryptage est réversible grâce à l'utilisation d'une clé secrète. PHP dispose d’une bibliothèque très complète pour crypter décrypter ce qu'on veut (mcrypt).
Les hachages sha1() ou md5() sont réputés plus sécurisés mais réfléchissons un instant: un utilisateur choisi son mdp, l'envoie, en clair dans la plupart des cas, par formulaire. Sur le serveur on le stocke en bdd, haché en md5 ou sha1. D'accord c'est quasiment indéchiffrable pour un pirate (quoique...). Mais si on prend le soin de le hacher en bdd, c'est qu'on craint qu'il accède à la bdd et qu'il puisse y lire tous les mdp.
Maintenant, soyons réalistes, s'il accède à la bdd, il y a de grandes chances qu'il puisse y faire également tout ce qu'il veut! Il n'a plus besoin des mdp!
OK, il y a le cas du piratage par injection d'un SELECT sur la table des mdp. Il reçoit, en retour, la liste des mdp hachés. Il n'a pas accès à la bdd mais il a les mdp. Maintenant haché ou crypté...
S'il est motivé pour décrypter, il réussira sans doute très bientôt à dé-hacher md5 ou sha1. C'est une question de temps.
http://www.cryptography.com/cnews/hash.html
Solutions:
- formulaire de mot de passe et de login en SSL
- mot de passe stocké en md5 sha1 ou crypté avec une bonne clé secrète.
- protéger tous ses formulaires et bdd contre l'injection SQL
Maintenant, concernant le choix entre hachage et cryptage songez que beaucoup de sites « pro » sont capables de régénérer un mot de passe oublié. Ils utilisent donc le cryptage, pas le hachage.
Les protocoles SSL et SSH ou le standard PGP (Pretty Good Privacy), pour ne parler que des plus connus, utilisent également des techniques de cryptage/dé-cryptage (symétriques ou asymétriques).
Voilà, PHP permet d’utiliser les deux très facilement.
Faites votre choix !