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

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

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

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


person Claudiu    schedule 28.11.2008    source источник
comment
Хорошо написанная статья о том, почему вы не должны просто хешировать свои секреты / пароли. Вместо этого используйте HMAC. benlog.com/articles/2008/06/19/dont-hash -секреты   -  person Jay Kumar    schedule 09.12.2011
comment
Отличное резюме темы в блоге по безопасности StackExchange: security.blogoverflow. ru / 2011/11 /   -  person David J. Liszewski    schedule 16.02.2014
comment
@JayKumar: Статья, на которую вы ссылаетесь, вводит в заблуждение. Он объединяет соли паролей (которые, как ожидается, будут видны злоумышленникам) с ключами MAC (которые, как ожидается, останутся секретными). Ссылка Дэвида Дж. Лишевского дает гораздо более точное описание.   -  person Rufflewind    schedule 13.06.2016


Ответы (9)


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

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

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

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

person Vinko Vrsalovic    schedule 28.11.2008
comment
Чтобы быть ясным, получите желаемую безопасность с помощью хеша, это должен быть криптографически безопасный алгоритм хеширования с особым свойством, что не только хэш необратим, НО ТАКЖЕ с вычислительной точки зрения непрактично генерировать ЛЮБУЮ другую строку, которая генерирует такой же хеш. - person Tall Jeff; 29.11.2008
comment
Да и нет ... Коллизии хэшей должно быть трудно генерировать ради безопасности вашего собственного приложения, но необратимости достаточно для предотвращения утечки пароля. - person Dave Sherohman; 29.11.2008
comment
Дэйв: Нет, это не так. Вот хеш, который необратим: f(n) = n % 2. Он также имеет очень высокую частоту конфликтов и совершенно бесполезен для криптографических целей. Отсутствие коллизий критично для криптографически безопасного хэша. - person Noon Silk; 08.09.2009
comment
шелковистый: а как именно вы собираетесь вернуть исходный пароль от вашей паршивой хеш-функции? Предлагаю вам перечитать комментарий Дэйва - person Vinko Vrsalovic; 08.09.2009
comment
Во всяком случае, хеш-функция с большим количеством конфликтов лучше для безопасности паролей, однако это, очевидно, означает, что для входа в учетную запись можно использовать больше паролей. - person williamvicary; 03.10.2012
comment
если пользователь получает доступ к серверу, он может получить доступ к файлам конфигурации. В таком случае рекомендуется ли не хранить соль в файлах конфигурации (т.е. следует ли жестко запрограммировать соль)? - person n00b; 05.11.2014
comment
Соль @ n00b не может быть жестко закодирована, потому что каждый хешированный элемент должен использовать отдельную соль. Дело в том, что если и UserA, и UserB используют пароль 1234, если вы узнаете пароль UserA, вы не можете сказать, что UserB использовал один и тот же пароль, потому что у них были разные соли. Сохранение солей в секрете не критично с точки зрения безопасности, большинство реализаций просто присоединяют соль к передней или задней части двоичного блоба, представляющего хэш. - person Scott Chamberlain; 01.06.2016
comment
@ScottChamberlain, как узнать, какая соль использовалась для генерации хеша пароля пользователя (т.е. хеша, хранящегося в / etc / shadow)? Кажется, что для успешной аутентификации требуется, чтобы мы знали, какая соль была использована, чтобы мы могли хэшировать ввод пользователя, чтобы мы могли получить тот же хеш. - person sherrellbc; 06.07.2016
comment
@sherrellbc Обычно соль добавляется к хешу в начале или в конце. В частности, в /etc/shadow данные между 2-м и 3-м $ - это использованная соль. Подробную информацию о том, как /etc/shadow хранит хэш и соль. - person Scott Chamberlain; 06.07.2016
comment
@VinkoVrsalovic будет ли использование независимых ключей для каждого зашифрованного пароля делать что-нибудь для снижения риска (увеличения сложности, требуемой хакерской машиной) двустороннего характера шифрования? - person Thomas; 09.03.2018
comment
Если ваша база данных принадлежит хакеру, этот парень попытается разобраться в данных, которые изначально не зашифрованы и не хешированы. Начать кампанию социальной инженерии, используя читаемые данные о клиентах, намного проще, и она дает более быстрые результаты. Хакер должен быть очень решительным, терпеливым и богатым, чтобы использовать большие вычислительные мощности для поиска вашего ключа. Шифрование, несомненно, сопряжено с этим риском - худшим кошмаром, но гибкость перехода к более безопасным хранилищам, перехода на более безопасные алгоритмы шифрования, ретроспективной проверки эффективности политик паролей может перевесить хеширование. - person Shrimpy; 01.07.2020
comment
Вопрос касался сравнения шифрования и хеширования - социальная инженерия вообще не входит в картину ответа, поскольку ее можно использовать независимо от того, шифруете ли вы или хешируете свои пароли. А что касается поиска ключа, все зависит от того, где вы его храните и как вы удаляете ключ в памяти после его использования. Я бы сказал, что гораздо проще иметь хорошо защищенную настройку хеширования, которую также можно обновить, когда появятся лучшие алгоритмы, чем хорошо защищенную настройку шифрования. - person Vinko Vrsalovic; 01.07.2020

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

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

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

person Bill the Lizard    schedule 28.11.2008

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

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


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

Шифрование хорошее?

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

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

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

person lkamal    schedule 04.11.2013
comment
Хорошо, но когда вы входите в службу, ваш пароль отправляется в виде открытого текста / зашифрован, потому что если он отправляется как хэш на сервер для сравнения. хакер мог бы, если бы он знал хэш, просто отправить хеш на сервер для входа в систему. Вот почему пароли для сравнения необходимо отправлять в зашифрованном виде на сервер, где они расшифровываются и хешируются. Это безопасно, правда? До тех пор, пока пароли никогда не хранятся в нехешированной форме в течение длительного времени, и все случаи использования зашифрованных / текстовых паролей стираются из любой памяти, когда они больше не нужны? - person AgentM; 14.04.2019

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

person CheGueVerra    schedule 28.11.2008

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

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

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

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

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

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

person Lasse V. Karlsen    schedule 28.11.2008

В идеале вам следует сделать и то, и другое.

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

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

person LogicMagic    schedule 22.07.2010
comment
Чем зашифровать? Если они так сильно взломали вас, что добрались до базы данных со всеми паролями ваших пользователей (хешированными, зашифрованными или другими), не смогли бы они найти ключ для их расшифровки? - person Luc; 24.10.2012
comment
Это не должно быть отвергнуто. Это возможность, которую не следует исключать, так просто, что база данных скомпрометирована, а приложение - нет. Поэтому шифрование хэша - это дополнительный уровень безопасности. - person Arie; 16.04.2015
comment
@ Люк Я не согласен с тобой, мой прежний я. Я видел слишком много SQL-инъекций, которые не скомпрометировали код приложения (или файлы конфигурации), и теперь я считаю, что добавление секрета полезно, будь то в форме шифрования или в виде перца, но он не должен заменять хеширование. Более полный ответ см. Здесь: security.stackexchange.com/a/31846/10863 - person Luc; 13.10.2018

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

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

Шифрование

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

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

person Rahul Garg    schedule 11.09.2015

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

person Peter Coulton    schedule 28.11.2008

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

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

person Philtron    schedule 10.12.2012
comment
Вы явно недостаточно хорошо прочитали принятый ответ. Прочтите внимательно: вы не должны предлагать функцию восстановления пароля. Вы должны предлагать функцию сброса пароля. Я управлял многими веб-сайтами в течение многих лет, включая vBulletin, phpBB, e107, IPB, blogspot и даже мою собственную CMS. Как администратору вам НИКОГДА не нужно иметь чей-то предварительно хешированный пароль. Просто нет. И у тебя этого тоже не должно быть. Если вы не согласны с тем, что я говорю, позвольте мне заверить вас: вы ошибаетесь. - person Lakey; 08.01.2013
comment
Извините за то, что был НАМНОГО слишком зол. Я просто вижу, что слишком много веб-сайтов хранят пароли в виде простого текста, и это меня расстраивает. В качестве примечания: некоторые веб-сайты, ориентированные на безопасность, любят периодически заставлять пользователей менять свои пароли. Они хотят убедиться, что человек не изменит свой пароль с Password1 на Password2. Таким образом, они сохраняют пароль в виде обычного текста, чтобы впоследствии провести эти сравнения. Это не лучшая практика. В этом случае им нужно выполнить анализ пароля ВПЕРВЫЕ, создав кучу похожих паролей - каждый хеширует - и сохранить только хеши. - person Lakey; 10.01.2013
comment
Нет проблем, это заставило меня вернуться и перечитать вопрос, а также провести дополнительные исследования, так что еще не все потеряно :-) Я не уверен, о чем я думал, когда писал этот ответ. ваше здоровье - person Philtron; 28.01.2013