В настоящее время на этот вопрос проголосовало наибольшее количество голосов :
Еще одна проблема, которая не так уж важна для безопасности, хотя и связана с безопасностью, это полная и явная неспособность понять разницу между хешированием пароля и его шифрованием . Чаще всего встречается в коде, где программист пытается предоставить небезопасную функцию «Напомнить мне мой пароль».
В чем именно эта разница? Мне всегда казалось, что хеширование - это форма шифрования. Какую небезопасную функцию имеет в виду плакат?
Ответы:
Хеширование - это односторонняя функция (ну, отображение). Это необратимо, вы применяете алгоритм безопасного хеширования и не можете вернуть исходную строку. Максимум, что вы можете сделать, - это сгенерировать так называемое «столкновение», то есть найти другую строку с таким же хешем. Криптографически безопасные алгоритмы хеширования предназначены для предотвращения возникновения коллизий. Вы можете атаковать безопасный хеш с помощью радужной таблицы , которой вы можете противодействовать, применив соль к хешу перед его сохранением.
Шифрование - это правильная (двусторонняя) функция. Это обратимо, вы можете расшифровать искаженную строку, чтобы получить исходную строку, если у вас есть ключ.
Небезопасная функциональность, на которую он ссылается, заключается в том, что если вы шифруете пароли, ваше приложение где-то хранит ключ, и злоумышленник, который получает доступ к вашей базе данных (и / или коду), может получить исходные пароли, получив как ключ, так и зашифрованный текст. , тогда как с хешем это невозможно.
Люди обычно говорят, что если взломщик владеет вашей базой данных или вашим кодом, ему не нужен пароль, поэтому разница спорный. Это наивно, потому что вы по-прежнему обязаны защищать пароли своих пользователей, главным образом потому, что большинство из них действительно используют один и тот же пароль снова и снова, подвергая их большему риску из-за утечки паролей.
источник
Хеширование - это односторонняя функция, а это означает, что после хеширования пароля очень сложно получить исходный пароль из хеша. Шифрование - это двусторонняя функция, при которой гораздо проще получить исходный текст из зашифрованного текста.
Простое хеширование легко победить с помощью атаки по словарю, когда злоумышленник просто предварительно хеширует каждое слово в словаре (или каждую комбинацию символов до определенной длины), а затем использует этот новый словарь для поиска хешированных паролей. Использование уникальной случайной соли для каждого сохраненного хешированного пароля значительно усложняет злоумышленнику использование этого метода. По сути, им нужно будет создать новый уникальный словарь для каждого используемого вами значения соли, что сильно замедлит их атаку.
Хранить пароли с использованием алгоритма шифрования небезопасно, потому что, если пользователю или администратору проще получить исходный пароль из зашифрованного текста, то злоумышленнику также проще сделать то же самое.
источник
Как показано на изображении выше, если пароль зашифрован, это всегда скрытый секрет, из которого кто-то может извлечь пароль в виде обычного текста. Однако, когда пароль хешируется, вы расслабляетесь, так как вряд ли существует какой-либо метод восстановления пароля из хеш-значения.
Извлечено из зашифрованных или хешированных паролей - что лучше?
Шифрование хорошее?
Простые текстовые пароли могут быть зашифрованы с использованием симметричных алгоритмов шифрования, таких как DES, AES или с любыми другими алгоритмами, и храниться в базе данных. При аутентификации (подтверждающей личность с помощью имени пользователя и пароля) приложение расшифровывает зашифрованный пароль, хранящийся в базе данных, и сравнивает его с паролем, предоставленным пользователем, на предмет равенства. В этом типе подхода к обработке паролей, даже если кто-то получит доступ к таблицам базы данных, пароли нельзя будет просто повторно использовать. Однако в этом подходе есть и плохие новости. Если каким-то образом кто-то получит криптографический алгоритм вместе с ключом, используемым вашим приложением, он / она сможет просмотреть все пароли пользователей, хранящиеся в вашей базе данных, путем дешифрования. «Это лучший вариант, который у меня есть», - может крикнуть разработчик программного обеспечения, но есть ли способ лучше?
Криптографическая хеш-функция (односторонняя)
Да, возможно, вы упустили суть. Вы заметили, что нет необходимости расшифровывать и сравнивать? Если существует односторонний подход к преобразованию, когда пароль может быть преобразован в какое-либо преобразованное слово, но обратная операция (создание пароля из преобразованного слова) невозможна. Теперь, даже если кто-то получит доступ к базе данных, невозможно воспроизвести или извлечь пароли с использованием преобразованных слов. При таком подходе вряд ли кто-то сможет узнать совершенно секретные пароли ваших пользователей; и это защитит пользователей, использующих один и тот же пароль в нескольких приложениях. Какие алгоритмы можно использовать для этого подхода?
источник
Я всегда думал, что шифрование может быть преобразовано в обе стороны, так что конечное значение может привести вас к исходному значению, а с хешированием вы не сможете вернуться от конечного результата к исходному значению.
источник
Алгоритмы хеширования обычно являются криптографическими по своей природе, но основное отличие состоит в том, что шифрование обратимо посредством дешифрования, а хеширование - нет.
Функция шифрования обычно принимает ввод и производит зашифрованный вывод того же или немного большего размера.
Функция хеширования принимает входные данные и, как правило, выдает меньший результат, как правило, также фиксированного размера.
Хотя невозможно взять результат хеширования и «де-хешировать» его, чтобы вернуть исходный ввод, обычно вы можете перебором перейти к чему-то, что дает такой же хэш.
Другими словами, если схема аутентификации принимает пароль, хеширует его и сравнивает его с хешированной версией требуемого пароля, может не потребоваться, чтобы вы действительно знали исходный пароль, только его хэш, и вы можете подобрать ваш путь к чему-то подходящему, даже если это другой пароль.
Функции хеширования обычно создаются, чтобы свести к минимуму вероятность коллизий и затруднить вычисление чего-то, что будет давать такой же хеш, как и что-то еще.
источник
В идеале вам следует сделать и то, и другое.
Сначала хешируйте пароль для односторонней защиты. Используйте соль для дополнительной безопасности.
Затем зашифруйте хэш для защиты от атак по словарю, если ваша база данных хешей паролей будет скомпрометирована.
источник
Хеширование :
Это односторонний алгоритм, и после хеширования невозможно выполнить откат, и в этом его преимущество перед шифрованием.
Шифрование
Если мы выполним шифрование, для этого будет ключ. В случае утечки этого ключа все ваши пароли могут быть легко расшифрованы.
С другой стороны, даже если ваша база данных будет взломана или администратор вашего сервера взял данные из БД и вы использовали хешированные пароли, хакер не сможет взломать эти хешированные пароли. На самом деле это было бы практически невозможно, если бы мы использовали хеширование с надлежащей солью и дополнительной безопасностью с PBKDF2.
Если вы хотите узнать, как следует писать хэш-функции, посетите эту страницу .
Есть много алгоритмов для выполнения хеширования.
MD5 - использует хэш-функцию алгоритма дайджеста сообщения 5 (MD5). Длина выходного хеша составляет 128 бит. Алгоритм MD5 был разработан Роном Ривестом в начале 1990-х годов и сегодня не является предпочтительным вариантом.
SHA1 - использует хэш алгоритма безопасности (SHA1), опубликованный в 1995 году. Длина выходного хеша составляет 160 бит. Хотя этот вариант наиболее широко используется, сегодня он не является предпочтительным.
HMACSHA256 , HMACSHA384 , HMACSHA512 - используйте функции SHA-256, SHA-384 и SHA-512 семейства SHA-2. SHA-2 был опубликован в 2001 году. Длина выходного хеш-кода составляет 256, 384 и 512 бит соответственно, как указывают названия хеш-функций.
источник
Какими бы правильными ни были другие ответы, в контексте, в котором была цитата, хеширование - это инструмент, который можно использовать для защиты информации, шифрование - это процесс, который принимает информацию и затрудняет чтение / использование неавторизованными людьми.
источник
Вот одна из причин, по которой вы можете захотеть использовать одно вместо другого - получение пароля.
Если вы храните только хеш пароля пользователя, вы не можете предложить функцию «забытый пароль».
источник