В настоящее время я изучаю протоколы аутентификации пользователей для разрабатываемого мной веб-сайта. Я хотел бы создать файл 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;
Я вижу, что он уязвим для атак с воспроизведением, как указано в Протокол безопасных файлов cookie , но должен быть устойчивым к объемным атакам и криптографическому объединению.
ВОПРОС: Правильно ли я здесь, или есть серьезная уязвимость, которую я вы пропустили? Есть ли способ защиты от атак с воспроизведением, который работает с динамически назначаемыми IP-адресами и не использует сеансы?
ПРИМЕЧАНИЯ
Самый последний материал, который я прочитал:
Что нужно и чего нельзя делать при аутентификации клиента на Интернет
он же Fu et al.
( https://pdos.csail.mit.edu/papers/webauth:sec10.pdf )
Протокол безопасных файлов cookie
он же Лю и др.
( http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf )
который расширяет предыдущий метод
Защищенные файлы cookie сеанса без сохранения состояния
( http://www.lightbluetouchpaper.org/2008/05/16/hardened-stateless-session-cookies/ )
который также расширяет предыдущий метод.
Поскольку тема чрезвычайно сложна, я ищу ответы только от экспертов по безопасности с реальным опытом создания и взлома схем аутентификации.