Разница между хэшированием пароля и его шифрованием - PullRequest
121 голосов
/ 29 ноября 2008

Текущий рейтинг проголосовал за этот вопрос говорится:

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

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

Ответы [ 9 ]

192 голосов
/ 29 ноября 2008

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

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

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

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

30 голосов
/ 29 ноября 2008

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

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

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

10 голосов
/ 04 ноября 2013

Encrypted vs Hashed Passwords

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


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

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

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

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

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

8 голосов
/ 29 ноября 2008

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

7 голосов
/ 29 ноября 2008

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

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

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

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

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

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

3 голосов
/ 11 сентября 2015

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

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

Шифрование

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

С другой стороны, даже если ваша база данных будет взломана или администратор вашего сервера получит данные из БД и вы использовали хешированные пароли, хакер не сможет взломать эти хешированные пароли. Это на самом деле практически невозможно, если мы используем хеширование с надлежащей солью и дополнительную безопасность с 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 бит соответственно, как указывают названия хеш-функций.

3 голосов
/ 22 июля 2010

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

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

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

1 голос
/ 29 ноября 2008

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

0 голосов
/ 10 декабря 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...