Разница между хэшированием пароля и его шифрованием

Нынешний, получивший наибольшее количество голосов по этому вопросу, заявляет

Еще одна проблема, которая не столько связана с безопасностью, хотя и связана с безопасностью, является полной и полной неудачей, чтобы избежать разницы между хешированием пароля и его шифрованием. Чаще всего встречается в коде, где программист пытается обеспечить небезопасную функциональность "Напомнить мне мой пароль".

В чем именно эта разница? У меня всегда было впечатление, что хеширование является формой шифрования. Что такое небезопасная функциональность, на которую ссылается плакат?

9 ответов

Решение

Хеширование - это односторонняя функция (ну, отображение). Это необратимо, вы применяете алгоритм безопасного хэширования и не можете вернуть исходную строку. Максимум, что вы можете сделать, это сгенерировать то, что называется "столкновением", то есть найти другую строку, которая предоставляет тот же хеш. Криптографически безопасные алгоритмы хеширования предназначены для предотвращения возникновения коллизий. Вы можете атаковать безопасный хеш с помощью радужного стола, которому можно противостоять, применяя соль к хешу перед его сохранением.

Шифрование является правильной (двухсторонней) функцией. Это обратимо, вы можете расшифровать искаженную строку, чтобы получить исходную строку, если у вас есть ключ.

Небезопасная функциональность, на которую он ссылается, заключается в том, что если вы шифруете пароли, в вашем приложении где-то хранится ключ, а злоумышленник, который получает доступ к вашей базе данных (и / или коду), может получить оригинальные пароли, получив как ключ, так и зашифрованный текст. тогда как с хешем это невозможно.

Люди обычно говорят, что если взломщик владеет вашей базой данных или вашим кодом, ему не нужен пароль, поэтому различие не имеет значения. Это наивно, потому что вы по-прежнему обязаны защищать пароли своих пользователей, в основном потому, что большинство из них используют один и тот же пароль снова и снова, подвергая их большему риску из-за утечки их паролей.

Хеширование - это односторонняя функция, означающая, что после хэширования пароля очень трудно получить исходный пароль из хеша. Шифрование - это двусторонняя функция, в которой намного проще получить исходный текст из зашифрованного текста.

Простое хеширование легко победить с помощью атаки по словарю, когда злоумышленник просто предварительно хеширует каждое слово в словаре (или каждую комбинацию символов до определенной длины), а затем использует этот новый словарь для поиска хешированных паролей. Использование уникальной случайной соли для каждого сохраненного хешированного пароля значительно усложняет для злоумышленника использование этого метода. По сути, им нужно будет создать новый уникальный словарь для каждого значения соли, которое вы используете, и ужасно замедлит их атаку.

Хранить пароли с использованием алгоритма шифрования небезопасно, потому что, если пользователю или администратору проще вернуть исходный пароль из зашифрованного текста, злоумышленнику также будет проще сделать то же самое.

Зашифрованные против хешированных паролей

Как показано на изображении выше, если пароль зашифрован, это всегда скрытый секрет, где кто-то может извлечь пароль в виде простого текста. Однако, когда пароль хешируется, вы расслаблены, так как вряд ли существует какой-либо способ восстановления пароля из значения хеша.


Извлечено из зашифрованных против хешированных паролей - что лучше?

Хорошо ли шифрование?

Обычные текстовые пароли могут быть зашифрованы с использованием симметричных алгоритмов шифрования, таких как DES, AES или с любыми другими алгоритмами, и храниться в базе данных. При аутентификации (подтверждении идентичности с помощью имени пользователя и пароля) приложение расшифровывает зашифрованный пароль, хранящийся в базе данных, и сравнивает его с предоставленным пользователем паролем на равенство. При таком подходе к обработке паролей, даже если кто-то получит доступ к таблицам базы данных, пароли не будут использоваться повторно. Однако в этом подходе есть и плохие новости. Если кто-то каким-то образом получит криптографический алгоритм вместе с ключом, используемым вашим приложением, он / она сможет просматривать все пользовательские пароли, хранящиеся в вашей базе данных, путем расшифровки. "Это лучший вариант, который я получил", может кричать разработчик программного обеспечения, но есть ли лучший способ?

Криптографическая хеш-функция (только в одну сторону)

Да, может быть, вы упустили момент здесь. Вы заметили, что нет необходимости расшифровывать и сравнивать? Если существует односторонний подход к преобразованию, при котором пароль может быть преобразован в некоторое преобразованное слово, но обратная операция (генерация пароля из преобразованного слова) невозможна. Теперь, даже если кто-то получит доступ к базе данных, пароли не могут быть воспроизведены или извлечены с использованием преобразованных слов. При таком подходе вряд ли кто-то узнает сверхсекретные пароли ваших пользователей; и это защитит пользователей, использующих один и тот же пароль для нескольких приложений. Какие алгоритмы можно использовать для этого подхода?

Алгоритмы хеширования обычно носят криптографический характер, но принципиальное отличие состоит в том, что шифрование обратимо посредством дешифрования, а хеширование - нет.

Функция шифрования обычно принимает ввод и производит зашифрованный вывод того же или немного большего размера.

Функция хеширования принимает входные данные и выдает обычно меньшие выходные данные, как правило, также фиксированного размера.

Хотя невозможно получить хешированный результат и "разархивировать" его, чтобы получить исходный ввод, обычно вы можете грубо форсировать свой путь к чему-то, производящему тот же хеш.

Другими словами, если схема аутентификации берет пароль, хэширует его и сравнивает его с хешированной версией требуемого пароля, может не потребоваться, чтобы вы действительно знали исходный пароль, только его хеш, и вы можете использовать brute-force ваш путь к чему-то, что будет соответствовать, даже если это другой пароль.

Хеш-функции, как правило, создаются для минимизации вероятности коллизий и усложняют вычисление того, что будет производить тот же хеш, что и другое.

Я всегда думал, что Шифрование может быть преобразовано в обоих направлениях, таким образом, что конечное значение может привести вас к исходному значению, и с помощью хеширования вы не сможете вернуться от конечного результата к исходному значению.

Хеширование:

Это односторонний алгоритм, и после хеширования откат невозможен, и в этом его прелесть против шифрования.

шифрование

Если мы выполним шифрование, для этого будет ключ. Если этот ключ будет утек, все ваши пароли могут быть легко расшифрованы.

С другой стороны, даже если ваша база данных будет взломана или администратор вашего сервера получит данные из БД и вы использовали хешированные пароли, хакер не сможет взломать эти хешированные пароли. Это на самом деле практически невозможно, если мы используем хеширование с надлежащей солью и дополнительную безопасность с PBKDF2.

Если вы хотите взглянуть на то, как вы должны писать свои хеш-функции, вы можете посетить здесь.

Существует много алгоритмов для хеширования.

  1. MD5 - использует хэш-функцию алгоритма дайджеста сообщения 5 (MD5). Выходной хэш имеет длину 128 бит. Алгоритм MD5 был разработан Роном Ривестом в начале 1990-х годов и сегодня не является предпочтительным вариантом.

  2. SHA1 - использует хэш-алгоритм алгоритма безопасности (SHA1), опубликованный в 1995 году. Длина выходного хэша составляет 160 бит. Хотя наиболее широко используется, это не предпочтительный вариант сегодня.

  3. HMACSHA256, HMACSHA384, HMACSHA512 - используйте функции SHA-256, SHA-384 и SHA-512 семейства SHA-2. SHA-2 был опубликован в 2001 году. Длина выходного хэша составляет 256, 384 и 512 бит соответственно, как указывают названия хэш-функций.

В идеале вы должны сделать оба.

Сначала хеш-пароль для односторонней безопасности. Используйте соль для дополнительной безопасности.

Затем зашифруйте хеш для защиты от словарных атак, если ваша база данных хэшей паролей взломана.

Как бы правильно ни звучали другие ответы, в контексте, в котором была цитата, хеширование - это инструмент, который можно использовать для защиты информации, шифрование - это процесс, который принимает информацию и очень затрудняет чтение / использование посторонними людьми.

Вот одна из причин, по которой вы можете использовать одну над другой - восстановление пароля.

Если вы храните только хэш пароля пользователя, вы не можете предложить функцию "забытого пароля".

Другие вопросы по тегам