В вашем случае нарушение алгоритма хеширования эквивалентно обнаружению коллизии в алгоритме хеширования. Это означает, что вам не нужно находить сам пароль (который будет атака с прообразом ), вам просто нужно найти вывод хеш-функции, равный хешу действительного пароля (таким образом, "столкновение"). Нахождение коллизии с использованием атаки на день рождения занимает время O (2 ^ (n / 2)), где n - длина хэш-функции в битах.
SHA-2 имеет выходной размер 512 битов, поэтому нахождение коллизии потребует O (2 ^ 256) времени. Принимая во внимание, что нет никаких умных атак на сам алгоритм (в настоящее время никто не известен для семейства хэшей SHA-2), это то, что нужно, чтобы взломать алгоритм.
Чтобы понять, что на самом деле означает 2 ^ 256: в настоящее время считается, что число атомов во вселенной (всего !!!) составляет примерно 10 ^ 80, что примерно равно 2 ^ 266. Предполагая 32-байтовый ввод (что для вашего случая вполне разумно - 20 байт соли + 12-байтовый пароль), моя машина занимает ~ 0,22 с (~ 2 ^ -2 с) для 65536 (= 2 ^ 16) вычислений. Таким образом, 2 ^ 256 вычислений будет выполнено в 2 ^ 240 * 2 ^ 16 вычислений, что займет
2^240 * 2^-2 = 2^238 ~ 10^72s ~ 3,17 * 10^64 years
Даже называть это миллионами лет смешно. И это не намного лучше с самым быстрым оборудованием на планете, вычисляющим тысячи хэшей параллельно. Ни одна человеческая технология не сможет превратить это число в нечто приемлемое.
Так что забудьте про перебор SHA-256 здесь. Ваш следующий вопрос был о словарных словах. Для извлечения таких слабых паролей традиционно использовались радужные таблицы . Радужная таблица - это, как правило, просто таблица предварительно вычисленных значений хеша. Идея состоит в том, что если бы вы смогли предварительно вычислить и сохранить каждый возможный хеш вместе с его входными данными, то вам понадобится O (1), чтобы найти заданный хеш и получить действительный прообраз для этого. Конечно, на практике это невозможно, поскольку нет устройства хранения, которое могло бы хранить такие огромные объемы данных. Эта дилемма известна как компромисс между временем и памятью . Поскольку вы можете хранить только столько значений, типичные радужные таблицы включают некоторую форму хэш-цепочки с промежуточными функциями сокращения (это подробно объясняется в статье в Википедии), чтобы сэкономить пространство, отказавшись от небольшой экономии времени.
Соли были контрмерой, чтобы сделать такие радужные столы неосуществимыми. Чтобы отговорить злоумышленников от предварительного вычисления таблицы для конкретной соли, рекомендуется применять значения соли для каждого пользователя. Однако, поскольку пользователи не используют безопасные, абсолютно случайные пароли, все еще удивительно, насколько успешными вы можете быть, если соль известна, и вы просто перебираете большой словарь общих паролей в простой схеме проб и ошибок. Соотношение между естественным языком и случайностью выражается как энтропия . Типичный выбор пароля обычно имеет низкую энтропию, тогда как полностью случайные значения будут содержать максимум энтропии.
Низкая энтропия типичных паролей делает возможной относительно высокую вероятность того, что один из ваших пользователей будет использовать пароль из сравнительно небольшой базы общих паролей. Если вы поищите их в Google, вы в конечном итоге найдете торрент-ссылки для таких баз паролей, часто в категории размера в гигабайтах. Успешность использования такого инструмента обычно составляет от нескольких минут до нескольких дней, если злоумышленник не ограничен каким-либо образом.
Вот почему обычно одного хэширования и посола недостаточно, вам необходимо установить и другие механизмы безопасности.Вам следует использовать искусственно замедленный метод энтропийного энтузиазма, такой как PBKDF2, описанный в PKCS # 5 , и вы должны установить период ожидания для данного пользователя, прежде чем он сможет повторить попытку ввода своего пароля.Хорошая схема - начинать с 0,5 с, а затем удваивать это время для каждой неудачной попытки.В большинстве случаев пользователи не замечают этого и не выходят из строя гораздо чаще, чем в среднем три раза.Но это значительно замедлит любого злоумышленника, пытающегося атаковать ваше приложение.