web-dev-qa-db-fra.com

Les jetons de réinitialisation de mot de passe doivent-ils être hachés lorsqu'ils sont stockés dans une base de données?

Les mots de passe sont hachés de sorte que si quelqu'un accède à une base de données de mots de passe, il ne saura pas quels sont les mots de passe réels et ne pourra donc pas se connecter.

Cependant, si je peux obtenir un jeton de réinitialisation de mot de passe valide (le type qui serait envoyé par e-mail à un utilisateur lorsqu'il a oublié son mot de passe), n'est-ce pas aussi bon qu'un mot de passe?

Je pourrais prendre un jeton, le brancher sur la page de réinitialisation et définir le mot de passe à tout ce que je veux et maintenant j'ai accès.

Par conséquent, les jetons de réinitialisation de mot de passe ne devraient-ils pas également être hachés dans la base de données?

29
Ian Warburton

Oui, vous devez hacher les jetons de réinitialisation de mot de passe, exactement pour les raisons que vous avez mentionnées.

Mais non, ce n'est pas aussi mauvais que les mots de passe non hachés, car

  1. les jetons de réinitialisation expirent et tous les utilisateurs n'en ont pas un actif
  2. les utilisateurs remarquent lorsque leurs mots de passe sont modifiés, mais pas lorsque leurs mots de passe sont fissurés, et peuvent ainsi prendre des mesures pour limiter les dommages (changer le mot de passe et autres données sensibles, etc.).

De plus, lorsque les utilisateurs réutilisent des mots de passe, un attaquant peut essayer un mot de passe craqué pour d'autres comptes, comme le courrier électronique des utilisateurs, augmentant ainsi les dégâts.

23
tim

Non, il n'y a pas de besoin écrasant de jetons de réinitialisation de mot de passe de hachage, tant qu'ils sont limités dans le temps et à usage unique. Il y a un avantage à hacher les jetons de réinitialisation, mais l'avantage est moindre qu'avec les mots de passe, donc je ne considérerais pas le hachage des jetons de réinitialisation comme absolument nécessaire.

En règle générale, les jetons de réinitialisation de mot de passe sont limités dans le temps. Par exemple, ils peuvent être bons seulement pour une heure, et ils expirent après cela. De plus, les jetons de réinitialisation de mot de passe sont normalement limités, ils ne peuvent donc être utilisés qu'une seule fois et, après avoir été utilisés, ils sont révoqués. C'est une bonne pratique et vous devriez certainement le faire.

Si vous faites cela, il n'est pas absolument nécessaire de hacher les jetons de réinitialisation de mot de passe lorsqu'ils sont stockés dans votre base de données. Souvenons-nous du modèle de menace contre lequel le hachage est conçu: il est conçu pour atténuer les violations de base de données ponctuelles. En d'autres termes, nous supposons que l'adversaire trouve une vulnérabilité qui lui permet de vider la base de données à un moment donné. (Peut-être une vulnérabilité d'injection SQL, ou quelque chose comme ça.) Nous voulons limiter les dommages autant que possible, si cela se produit.

Pour les mots de passe, il est important de les hacher. Si vous ne le faites pas, deux mauvaises choses se produisent: (i) une seule violation de base de données compromet le mot de passe de chaque utilisateur, permettant à l'attaquant d'accéder à chaque compte d'utilisateur sur votre site; et (ii) parce que les utilisateurs réutilisent souvent leurs mots de passe sur d'autres sites, cela peut permettre à l'attaquant d'accéder aux comptes de vos utilisateurs sur d'autres sites. Si vous faites du hachage, une violation de base de données est toujours mauvaise, mais elle l'est beaucoup moins.

Pour les jetons de réinitialisation de mot de passe, aucun de ces deux n'est vrai. Disons que vous ne hachez pas les jetons de réinitialisation de mot de passe. Ensuite, une seule violation de base de données ne révélera que l'ensemble des jetons de réinitialisation qui sont actifs au moment de la violation. Vous pouvez avoir des millions d'utilisateurs sur votre site, mais seulement quelques jetons de réinitialisation actifs sur ce tiem, donc seuls quelques utilisateurs ont leurs comptes exposés. C'est beaucoup, beaucoup moins grave.

De plus, les jetons de réinitialisation de mot de passe sont choisis au hasard et non par l'utilisateur. Par conséquent, ils ne sont pas réutilisés sur d'autres sites et compromettent un jeton de réinitialisation pour le site x.com ne présente aucun risque pour le compte de l'utilisateur sur d'autres sites (par exemple, y.com). Ainsi, la deuxième raison pour laquelle nous hachons les mots de passe des utilisateurs ne s'applique pas non plus à la réinitialisation des jetons.

Il convient de mentionner qu'il existe un scénario dans lequel des jetons de réinitialisation de mot de passe non hachés peuvent être exploités: si l'attaquant parvient à accéder en lecture à la base de données, l'attaquant peut demander une réinitialisation du mot de passe pour un utilisateur (alice), lire la base de données pour observer le jeton de réinitialisation du mot de passe de alice, puis l'utiliser pour modifier le mot de passe de alice et accéder à son compte. Cependant, il existe ici des facteurs atténuants. L'attaquant doit le faire en temps réel, donc la fenêtre de temps de l'attaquant est limitée. L'attaque est très bruyante et détectable, car un e-mail est envoyé à alice. Si l'attaquant tentait de prendre le contrôle de nombreux comptes de cette manière, la violation serait probablement remarquée très rapidement (les utilisateurs contacteraient les administrateurs du site, qui, espérons-le, enquêteraient). Ceci dissuade les attaquants qui tentent de lancer une telle attaque contre de nombreux utilisateurs. Cela n'empêche pas une attaque ciblée où l'attaquant ne souhaite affecter que quelques utilisateurs, mais cela rend moins probable qu'un attaquant puisse accéder aux comptes de tout le monde (comme cela se produirait avec un mot de passe non haché). Ainsi, les jetons de réinitialisation non hachés sont moins inquiétants que les mots de passe non hachés.

Ne vous méprenez pas. Il y a un certain avantage à hacher les jetons de réinitialisation de mot de passe. Cependant, il faut également un certain effort pour écrire le code pour hacher les jetons de réinitialisation. Étant donné que les avantages en matière de sécurité sont limités, du point de vue de la gestion des risques, il ne serait pas ridicule de décider de stocker les jetons de réinitialisation sans hachage.

Je ne dis pas "ne pas réinitialiser les jetons de hachage". Si vous avez une chance de les hacher, allez-y: vous obtiendrez des avantages en matière de sécurité. Dans le même temps, pour mettre cela en perspective, ce n'est probablement pas la fonctionnalité de sécurité la plus importante à implémenter. Vous pouvez probablement trouver de nombreuses autres façons de renforcer la sécurité de votre site qui offriront de plus grands avantages.

Conclusion: le hachage des jetons de réinitialisation de mot de passe présente certains avantages, mais il est limité. Je ne le considère pas comme un élément de sécurité indispensable.

15
D.W.