В настоящее время я изучаю протоколы аутентификации пользователей для веб-сайта, который я разрабатываю. Я хотел бы создать файл cookie для проверки подлинности, чтобы пользователи могли войти в систему между страницами.
Вот мой первый bash:
cookie = user_id|expiry_date|HMAC(user_id|expiry_date, k)
Где k - HMAC(user_id|expiry_date, sk)
, а sk - это 256-битный ключ, известный только серверу. HMAC - это хэш SHA-256. Обратите внимание, что '|' является разделителем, а не просто конкатенацией.
В PHP это выглядит так:
$key = hash_hmac('sha256', $user_id . '|' . $expiry_time, SECRET_KEY);
$digest = hash_hmac('sha256', $user_id . '|' . $expiry_time, $key);
$cookie = $user_id . '|' . $expiry_time . '|' . $digest;
Я вижу, что он уязвим для Replay Attacks, как указано в Secure Cookie Protocol, но должен быть устойчивым к Volume Attacks и криптографическому сращиванию.
ВОПРОС: Я нахожусь на правильных линиях здесь, или есть огромная уязвимость, которую я пропустил? Есть ли способ защитить от Replay Attacks, который работает с динамически назначенными IP-адресами и не использует сеансы?
ПРИМЕЧАНИЯ
Самый последний материал, который я прочитал:
Дос и отсутствие аутентификации клиента в Интернете
aka Fu et al.
(https://pdos.csail.mit.edu/papers/webauth:sec10.pdf)
Безопасный протокол cookie
aka Liu и др.
(http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf)
который расширяется по предыдущему методу
Закаленные cookie-сессии без сохранения состояния
(http://www.lightbluetouchpaper.org/2008/05/16/hardened-stateless-session-cookies/)
который также расширяется по предыдущему методу.
Поскольку тема чрезвычайно сложная, я только ищу ответы экспертов по безопасности с реальным опытом в создании и нарушении схем аутентификации.