Disons que j'ai un système où l'une des exigences de sécurité est d'empêcher les utilisateurs de choisir un mot de passe correspondant à leur nom d'utilisateur. Les noms d'utilisateur ne sont pas sensibles à la casse, mais les mots de passe le sont. Les mots de passe sont stockés par le serveur en utilisant une fonction de hachage sécurisée qui ne peut pas être inversée.
Lorsque le compte est créé, le nom d'utilisateur et le mot de passe sont initialement disponibles en texte clair sur le serveur pour comparaison. Nous pouvons les comparer en mémoire (sans tenir compte de la casse) pour voir s'ils correspondent et demander à l'utilisateur de choisir un mot de passe différent si c'est le cas. Une fois cette vérification effectuée, le mot de passe est haché de manière sécurisée pour le stockage tandis que le nom d'utilisateur est stocké en texte brut. Aucun problème pour répondre à l'exigence ici.
Lorsque l'utilisateur veut changer son mot de passe, ou qu'il est en cours de modification pour lui, le serveur peut récupérer son enregistrement de nom d'utilisateur et le comparer à la valeur de mot de passe nouvellement choisie (encore une fois en ignorant case) pour voir si cela correspond. Aucun problème pour répondre aux exigences ici non plus.
Cependant, le système autorise également les changements de nom d'utilisateur. Au cours de ce processus de changement d'ID, l'utilisateur n'a pas nécessairement fourni son mot de passe en texte clair au serveur. Ils l'ont peut-être fait lors de leur authentification, mais le serveur ne conservera pas ce mot de passe en texte clair au cas où ils décideraient de changer leur nom d'utilisateur. Le mot de passe en clair n'est donc pas disponible pour vérifier la correspondance avec la valeur de nom d'utilisateur nouvellement choisie.
Afin de répondre à nos exigences, le serveur peut utiliser la même fonction de hachage sécurisé pour hacher le nouveau nom d'utilisateur et le comparer au mot de passe haché enregistré. S'ils correspondent, le serveur peut demander à l'utilisateur de choisir un nom d'utilisateur différent. Cependant, puisque le nom d'utilisateur n'est pas sensible à la casse, cette vérification peut échouer lorsqu'elle est vraisemblablement vraie. Si je soumets "PwdRsch1" comme nouveau choix de nom d'utilisateur et que mon mot de passe est "pwdrsch1", le système l'autorisera puisque les hachages ne correspondent pas. Je - ou pire, un attaquant - pourrais ensuite m'authentifier avec succès avec un nom d'utilisateur et un mot de passe correspondants de "pwdrsch1".
Nous pourrions forcer le nom d'utilisateur en minuscules avant le hachage et le vérifier par rapport au mot de passe, mais alors le scénario inverse est possible. Le nom d'utilisateur serait vérifié comme "pwdrsch1" par rapport à un mot de passe de "PwdRsch1" et autorisé car ceux-ci ne correspondent pas. Mais plus tard, je peux m'authentifier avec succès avec un nom d'utilisateur et un mot de passe correspondants de "PwdRsch1".
Quelles options raisonnables ai-je pour réduire ce risque d'un mot de passe correspondant à un nom d'utilisateur qui n'est pas sensible à la casse?