Reformuler la question
Pourquoi stocker les mots de passe des utilisateurs?
La réponse la plus simple est que vous devez le faire. Vous conservez toujours les mots de passe dans votre méthode alternative. C'est juste que vous utilisez le système intégré de la base de données pour gérer le stockage. Votre méthode est donc aussi bonne que celle de votre base de données. C'est peut-être encore mieux que ce que vous pourriez faire autrement, mais cela n'évite pas le stockage. Cela évite vraiment de coder le stockage.
Cela pourrait aussi ne pas être mieux. Si je compromets une base de données et obtiens des copies des fichiers, je peux accéder directement aux tables. Il n'y a donc aucun intérêt à utiliser un système de gestion de mots de passe génial. Parce que si quelqu'un peut accéder à la table de niveau système contenant les mots de passe ou les mots de passe hachés, il peut également accéder directement aux fichiers. Pourquoi s'embêter à casser des mots de passe alors que vous avez déjà les données? Ce n'est pas comme si vous pouviez chiffrer les données facilement non plus. Chaque utilisateur doit pouvoir y accéder. Le chiffrement au niveau utilisateur ne fonctionnera donc pas aussi bien.
Mais ce que vous semblez vraiment demander, c'est
Pourquoi utiliser un schéma d'authentification au niveau de l'application alors que la base de données en a déjà un?
Sécurité
Ignorant la possibilité que vous puissiez écrire une version plus sécurisée, d'autres ont suggéré un certain nombre de raisons. Je suis généralement d'accord. Mais il y en a un autre que personne n'a encore mentionné. Vous compromettez la sécurité de votre base de données.
Dans ce système, chaque utilisateur de votre application possède un utilisateur de base de données et un mot de passe. Bien sûr, c'est un utilisateur limité, mais c'est toujours un utilisateur qui peut se connecter à la base de données. Même si vous utilisez la sécurité au niveau des lignes, vous autorisez toujours les utilisateurs finaux à connaître les informations de connexion à la base de données. S'il y a un exploit où un utilisateur peut obtenir un accès égal au niveau de la table, vous avez ouvert votre base de données pour attaquer. Et certains exploits sont allés au-delà de cet accès administrateur.
Dans les couches de l'oignon de sécurité, le système normal est:
- Base de données, qui autorise uniquement les connexions à partir de certaines machines.
- Base de données, autorise uniquement les connexions en tant que certaines combinaisons utilisateur / mot de passe.
- Serveurs avec des autorisations de base de données qui autorisent les connexions à partir d'applications.
- Les applications sont exécutées sur le serveur.
- Les applications ont des informations de connexion à la base de données avec des privilèges limités.
- Les applications authentifient les utilisateurs avant de leur permettre de modifier la base de données (sauf éventuellement pour créer de nouveaux comptes).
Dans ce système:
- Les utilisateurs finaux connaissent les combinaisons utilisateur / mot de passe qui fonctionneront sur la base de données, certes avec des privilèges très faibles.
- Il suffit de comprendre un serveur ou de faire semblant d'être un serveur autorisé.
Nous avons perdu tout le niveau de sécurité de l'application. Et nous avons volontairement abandonné une partie de la couche de base de données. Nous n'avons donc besoin que de deux exploits:
- Usurper ou compromettre un serveur autorisé.
- Augmentez l'accès du compte à privilège limité.
Si nous pouvons faire ces deux choses, nous avons accès à la base de données. On passe donc de trois couches à deux. (La troisième couche du système normal est que vous avez besoin d'un utilisateur valide pour vous connecter à la base de données.)
Vous allez faire beaucoup de gestion de ces comptes. Et si vous vous trompez? Au lieu de limiter l'utilisateur X à certaines lignes seulement, vous leur donnez tous accès à une table critique. Ce genre de choses se fait normalement manuellement et il n'y en a que quelques-unes, donc elles sont faciles à auditer. Mais dans votre système, vous pourriez créer des milliers, voire des millions, voire des milliards de comptes d'utilisateurs, chacun avec son propre accès idiosyncrasique.
D'ailleurs, le système de la base de données s'adapte-t-il à des millions ou des milliards d'utilisateurs? Si c'est le cas, qu'en est-il du nombre de règles? Si chaque utilisateur adopte une centaine de règles ou plus sur ce qu'il peut et ne peut pas accéder, cela peut-il atteindre un milliard d'utilisateurs? Vous prenez un système normalement à petite échelle et vous le faites à grande échelle. Cela ne fonctionnera pas nécessairement. Vous pouvez rencontrer des limitations du système à mesure que vous grandissez.