Якщо ваш веб-хостинг дозволяє, або вам доведеться мати справу з конфіденційними даними, тоді використовуйте HTTPS, періодично. (Це часто вимагає закон afaik).
Інакше, якщо ви хочете щось зробити через HTTP. Я б робив щось подібне.
- Сервер вбудовує свій відкритий ключ на сторінку входу.
- Клієнт заповнює форму для входу та натискає кнопку.
- Запит AJAX отримує поточну позначку часу від сервера.
- Сценарій клієнтської сторони об'єднує облікові дані, часову позначку та сіль (хеширується з аналогових даних, наприклад, рухи миші, події натискання клавіш), шифрує її за допомогою відкритого ключа.
- Подає отриманий хеш.
- Сервер розшифровує хеш
- Перевіряє, чи часова мітка досить недавня (дозволяє лише коротке вікно 5-10 секунд). Відхиляє вхід, якщо позначка часу занадто стара.
- Зберігає хеш 20 секунд. Відхиляє той самий хеш для входу протягом цього інтервалу.
- Аутентифікує користувача.
Таким чином, пароль захищений і той самий хеш аутентифікації не може бути відтворений.
Про безпеку маркера сеансу. Це трохи складніше. Але можливо повторно використовувати маркер вкраденого сеансу трохи складніше.
- Сервер встановлює додатковий cookie сеансу, який містить випадкову рядок.
- Веб-переглядач повертає цей cookie на наступний запит.
- Сервер перевіряє значення файлу cookie, якщо воно інше, воно знищує сеанс, інакше все в порядку.
- Сервер знову встановлює файл cookie з різним текстом.
Отже, якщо маркер сеансу був викрадений, а запит надіслав хтось інший, то при наступному запиті початкового користувача сеанс буде знищений. Тож якщо користувач активно переглядає сайт, часто клацаючи посилання, то злодій не піде далеко з викраденим маркером. Цю схему можна зміцнити, вимагаючи іншої автентифікації для чутливих операцій (наприклад, видалення облікового запису).
EDIT: Зверніть увагу: це не запобігає атакам MITM, якщо зловмисник налаштовує свою власну сторінку з іншим відкритим ключем та проксі-сервісами на сервер. Для захисту від цього відкритий ключ потрібно закріпити в локальній пам’яті браузера або в додатку, щоб виявити подібні хитрощі.
Про реалізацію: RSA, мабуть, є найбільш відомим алгоритмом, але для довгих клавіш він досить повільний. Я не знаю, якою швидкою була б реалізація PHP або Javascript. Але, ймовірно, є більш швидкі алгоритми.