Іноді я бачу запитання, як безпечно зберігати паролі користувачів для веб-програми (використовуючи RDBMS, я не говорю про Facebook чи Twitter). Звичайна відповідь - "соліть пароль, потім хешуйте його за допомогою сильного алгоритму, такого як TDES або SHA512".
Моє запитання: як користувач RDBMS, чому я взагалі турбуватися про проблематичне зберігання паролів, оскільки більшість двигунів мають вбудований механізм аутентифікації.
Наприклад, якщо якийсь користувач X хоче створити пароль користувача облікового запису Y у своїй веб-програмі, як неправильно видавати такий запит:
CREATE USER X WITH ENCRYPTED PASSWORD Y IN GROUP baseuser;
Тоді в межах моєї програми користувач може відкрити підключення до бази даних за допомогою своїх облікових даних, і мені взагалі не потрібно перейматися керуванням паролем.
Я бачу численні переваги цього методу:
- Якщо RDBMS вирішить, що алгоритм шифрування потрібно змінити, мені не потрібно нічого торкатися, лише застосувати оновлення безпеки;
- Мені легко керувати авторизаціями користувачів. Якщо користувач переходить на роль адміністратора, мені просто потрібно додати користувача до відповідної групи;
- Ін'єкції SQL тепер безглузді, оскільки я керую дозволами, щоб дозволити саме те, що я хочу дозволити кожному користувачеві в базі даних (наприклад, на форумі, як SO, додавання нових публікацій, відповіді на повідомлення, коментування та редагування / видалення власних питань / відповіді / коментарі);
- Обліковий запис користувача "анонімний" можна використовувати для несанкціонованого підключення до моєї програми;
- Кожен користувач є власником наданих ним даних.
Але практично в кожному питанні, яке я бачу на цю тему, існує загальна думка, що це не так, як треба робити. Моє запитання: чому?
Примітка. Третій пункт дозволений політикою в PostgreSQL та політикою безпеки в Microsoft SQL Server. Я усвідомлюю, що ці поняття є новичками, але все одно, тепер, коли вони є тут, чому техніка, яку я описую, не стала стандартним способом обробки облікових записів користувачів?