Причина, по которой предлагается добавить соль, проста. Как правило, когда вы создаете этот «отпечаток пальца» - если вы используете только один элемент данных, который имеет ограниченный набор данных, тогда это облегчает для внешнего хакера генерировать это и захватывать сеанс.
В приведенном выше примере да, если у злоумышленника есть как «отпечаток пальца», так и агент «Пользователь», тогда они смогут захватить сеанс.
Добавление соли только делает его более трудным для атакующего для создания отпечатков пальцев, это случай «, если у них есть все, кроме одной части информации, то последняя часть информации бесполезна)
Я d предположите, что вы добавили еще несколько вещей, например, в 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()
Для этого требуется имя пользователя и пароль пользователя, текущее время и заданная соль. Это было бы трудно для злоумышленника генерировать из-за соли и времени (хотя, обратите внимание, что это только защищено тем фактом, что он изменяется после его использования, со временем это не займет много времени для кого-то взломать это для конкретного пользователя, если он не изменился)
, в том числе IP-адрес в сеансе отпечатка пальца, является плохим, поскольку он не позволяет пользователям законно изменять IP-адреса, например, линию DSL, которая отключает – Guss
@Guss: когда это произойдет (или когда автообновление браузера агента пользователя), то я аннулировать сеанс. Не важно, пользователь должен повторно войти в систему. – cherouvim