Я просто посмотрел на реализацию хэширования паролей в Django и заметил что он добавляет соль, поэтому хэш создается как sha1(salt + password)
, например.
На мой взгляд, соли хороши для двух целей
-
Предотвращение поиска радужных таблиц
Хорошо, добавление/добавление соли действительно не влияет на таблицы радуги.
-
Усиление против грубой силы/словарных атак
Вот о чем мой вопрос. Если кто-то хочет атаковать один пароль из похищенной базы паролей, ему нужно попробовать много паролей (например, словарные слова или [A-Za-z0-9]).
Предположим, что мой пароль - "abcdef", соль - "соль", и злоумышленник пытается использовать все [a-z] {6} пароли.
С добавленной солью нужно вычислить
hash("salt")
, сохранить состояние алгоритма хеширования и затем перейти от этой точки для каждой перестановки. То есть, через все перестановки будут выполняться 26 ^ 6 операций с копией-хэш-алгоритмом-state-struct и 26 ^ 6hash(permutation of [a-z]{6})
. Поскольку копирование состояния алгоритма хеширования происходит быстро, соль вряд ли добавляет никакой сложности здесь, независимо от того, как долго это происходит.Но с добавленной солью злоумышленник должен вычислить
hash(permutation of [a-z]{6} + salt)
для каждой перестановки, что приведет к 26 ^ 10 хэш-операциям. Таким образом, добавляемые соли добавляют сложность в зависимости от длины соли.
Я не считаю, что это связано с историческими причинами, потому что Django является довольно новым. Итак, какой смысл в добавочных солях?