Я розробляю API для REST-сервісу, який я буду виробляти і споживати. Я витратив останні кілька днів, намагаючись зрозуміти, як добре поводитися з аутентифікацією, і думаю, що нарешті щось придумав.
Я придумую це на основі таких фактів щодо стека додатків:
- Клієнт і сервер знаходяться в .NET4 (частина клієнта в профілі клієнта)
- Сервер виставляє за допомогою WCF REST
- Я дійсно не хочу зберігати ім’я користувача та пароль у пам’яті в додатку
З 3-го року я хотів використати форму аутентифікації лексеми, так що після того, як сервер підтверджує облікові дані, клієнт отримує токен для використання в решті програми (це дозволить мені робити інші речі, наприклад, витримка користувачів, можливість безперебійного переміщення користувачів між веб-та настільними версіями тощо). Зрозумівши, як зробити дзвінки повторними та несанкціонованими, я придумав таке:
- Перш ніж клієнт намагається пройти автентифікацію, він генерує пару ключів Diffie-Hellman, використовуючи
ECDiffieHellmanCng
клас. - Він надсилає публічну частину пари ключів по дроту разом з іменем користувача та паролем (Звичайно HTTPS).
- Сервер ідентифікує комбінацію імені користувача / пароля, якщо це вдало, він виконує наступні дії:
- Створює унікальний маркер сеансу
- Створює власну пару ключів DH та обчислює загальний секрет із відкритого ключа, наданого клієнтом
- Зазначає маркер сеансу, загальну таємницю, користувача та час "останньої дії" (використовується для прокатного вікна закінчення терміну дії) у своїй базі даних
- Повертає маркер сеансу, його відкритий ключ DH та повідомлення про успішність аутентифікації
- Клієнт приймає ключ DH з відповіді, обчислює загальний секрет і зберігає в пам'яті як маркер, так і секрет.
З цього моменту комбінація токенів сесії / секрет працює як і більшість API REST, при цьому запит відбивається відбитками пальців і відмічається часом, а потім генерується якийсь HMAC. Кожен раз, коли клієнт виконує дію проти сервера, він перевіряє марку / секретну пару і дозволяє дію, якщо вона дійсна і не закінчилася, і оновлює останній запис дії в сеансі.
Я не бачу явних вад, і, мабуть, для цього перероблений, але мені потрібно навчитися це робити в якийсь момент. HMAC запобігає повторному нападу, DH-узгодження допомагає запобігти атакам MITM (я не можу придумати дієву атаку вгорі голови між HMAC / DH).
Будь-які діри, у яких хтось може проколотися?