Причина, по которой предлагается добавить соль, проста. Обычно, когда вы создаете этот «отпечаток» - если вы используете только один элемент данных, который имеет ограниченный набор данных, тогда внешнему хакеру будет проще сгенерировать его и захватить сеанс.
В приведенном выше примере, да, если у злоумышленника есть и «отпечаток пальца», и пользовательский агент, он сможет перехватить сеанс.
Добавление соли только усложняет для злоумышленника создание отпечатка пальца, это случай "если у них есть только одна часть информации, то последняя часть информации становится бесполезной)
Я бы предложил добавить еще кое-что, например, в vBulletin (проект, над которым я работал), хэш идентификатора сеанса (который в основном совпадает с отпечатком) генерируется с помощью следующего кода.
define('SESSION_IDHASH', md5($_SERVER['HTTP_USER_AGENT'] . $this->fetch_substr_ip($registry->alt_ip))); // this should *never* change during a session
Кроме того, хэш сеанса генерируется с использованием
md5(uniqid(microtime(), true));
Они оба проверяются при попытке идентифицировать сеанс
Итак, чтобы захватить сессию, человеку необходимо знать следующее
- Время (точно) на сервере, когда был создан сеанс
- Строка агента браузера пользователя
- IP-адрес пользователя
Они также должны были бы подделать IP-адрес (или, по крайней мере, первые 2/3 октета), чтобы сделать это.
Если они действительно находятся в точке, где им удалось получить вышеуказанную информацию, то они, вероятно, смогут атаковать другими способами, чем просто перехват сеанса.
vBulletin на самом деле не использует "соль" как таковую, но в приведенном выше примере соль просто добавляет ограниченное количество энтропии, всегда лучше найти как можно больше энтропии.
Например, в чем-то, что я сейчас пишу на python, я генерирую хэш для использования с защитой XSRF. Вот что я использую.
self.key = sha1(
self.user.username +
self.user.password +
settings.SECRET_KEY +
strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
).hexdigest()
, который берет имя пользователя и пароль пользователя, текущее время и заданную соль для генерации этого. Для злоумышленника это будет трудно сгенерировать из-за соли и времени (хотя, обратите внимание, что это обеспечивается только тем фактом, что он изменяется после того, как он используется, со временем кому-то не понадобится много времени, чтобы взломать это для конкретного пользователя, если оно не меняется)