В чем разница между обфускацией, хешированием и шифрованием?
В чем разница между обфускацией, хешированием и шифрованием?
Вот мое понимание:
- Хеширование - это односторонний алгоритм; не может быть отменено
- Запутывание похоже на шифрование, но не требует никакого "секрета" для понимания (ROT13 - один из примеров)
- Шифрование обратимо, но для этого требуется "секрет"
11 ответов
Хеширование - это метод создания полууникальных ключей на основе больших фрагментов данных. В данном хеше у вас в конечном итоге появятся "коллизии" (например, два разных куска данных, вычисляющих одно и то же значение хеша), и когда вы это делаете, вы обычно создаете больший размер хеш-ключа.
Обфускация обычно включает в себя попытку удалить полезные подсказки (то есть значимые имена переменных / функций), удалить пробелы, которые усложняют чтение, и, как правило, делать что-то запутанным образом, чтобы усложнить отслеживание происходящего. Он не обеспечивает серьезного уровня безопасности, как это делает "истинное" шифрование.
Шифрование может следовать нескольким моделям, одной из которых является "секретный" метод, называемый шифрованием с закрытым ключом, когда обе стороны имеют секретный ключ. Шифрование с открытым ключом использует общий односторонний ключ для шифрования и закрытый ключ получателя для расшифровки. С открытым ключом только получатель должен иметь секрет.
Это объяснение высокого уровня. Я постараюсь уточнить их:
Хеширование - в идеальном мире это случайный оракул. Для одного и того же входа X вы всегда получаете один и тот же выход Y, то есть в NO WAY, связанном с X. Это математически невозможно (или, по крайней мере, невозможно доказать, что это возможно). Самое близкое, что мы получаем, это функции люка H(X) = Y, так как с H-1(Y) = X так трудно сделать, что лучше попытаться грубой силой сделать Z такой, что H(Z) = Y
Запутывание (мое мнение) - любая функция f, такая, что f(a) = b, где вы полагаетесь на секретность f. F может быть хэш-функцией, но часть "обфускации" подразумевает безопасность через неизвестность. Если вы никогда не видели ROT13 раньше, это было бы запутывание
Шифрование - Ek(X) = Y, Dl(Y) = X, где E известен всем. k и l - ключи, они могут быть одинаковыми (симметрично, они одинаковы). Y - зашифрованный текст, X - открытый текст.
Хеш - это односторонний алгоритм, используемый для сравнения входных данных со ссылкой без ущерба для ссылки.
Он обычно используется в логинах для сравнения паролей, и вы также можете найти его в своем чеке, если совершаете покупки с помощью кредитной карты. Там вы найдете номер своей кредитной карты с некоторыми скрытыми номерами. Таким образом, вы сможете с высокой степенью вероятности доказать, что ваша карта использовалась для покупки вещей, в то время как кто-то, просматривающий ваш мусор, не сможет найти номер вашей карты.,
Очень наивный и простой хэш - "Первые 3 буквы строки". Это означает, что хешем "abcdefg" будет "abc". Эта функция, очевидно, не может быть отменена, что является целью хэша. Однако обратите внимание, что у "abcxyz" будет точно такой же хеш, это называется коллизией. Итак, еще раз: хэш только с определенной вероятностью доказывает, что два сравниваемых значения одинаковы.
Еще один очень наивный и простой хеш - это 5-модуль числа, здесь вы увидите, что 6,11,16 и т. Д. Будут иметь одинаковый хеш: 1.
Современные хеш-алгоритмы предназначены для того, чтобы максимально сократить число коллизий, но их никогда нельзя полностью избежать. Практическое правило гласит: чем длиннее ваш хэш, тем меньше у него коллизий.
Обфускация в криптографии кодирует входные данные до того, как они будут хешированы или зашифрованы.
Это делает атаки грубой силой менее осуществимыми, так как становится все труднее определить правильный открытый текст.
Это не плохое описание высокого уровня. Вот некоторые дополнительные соображения:
Хэширование обычно уменьшает большой объем данных до гораздо меньшего размера. Это полезно для проверки содержимого файла, например, без необходимости иметь две копии для сравнения.
Шифрование включает в себя хранение некоторых секретных данных, а безопасность секретных данных зависит от сохранения отдельного "ключа" в безопасности от злоумышленников.
Запутывание скрывает некоторую информацию без отдельного ключа (или с фиксированным ключом). В этом случае, сохраняя метод в секрете, вы сохраняете данные в безопасности.
Из этого вы можете увидеть, как алгоритм хеширования может быть полезен для цифровых подписей и проверки контента, как шифрование используется для защиты ваших файлов и сетевых подключений, и почему обфускация используется для управления цифровыми правами.
Вот как я всегда на это смотрел.
Хеширование извлекает значение из другого, используя заданный алгоритм. В зависимости от используемого алгоритма, это может быть одним из способов, а может и не быть.
Запутывание делает что-то более сложным для чтения из-за замены символов.
Шифрование похоже на хеширование, за исключением того, что значение зависит от другого значения, которое вы предоставляете алгоритму.
Краткий ответ:
Хеширование - создание поля проверки для некоторых данных (чтобы определить, когда данные изменяются). Это односторонняя функция, и исходные данные не могут быть получены из хеша. Типичными стандартами для этого являются SHA-1, SHA256 и т. Д.
Запутывание - измените ваши данные / код, чтобы запутать кого-либо еще (никакой реальной защиты). Это может или не может потерять некоторые из исходных данных. Для этого нет реальных стандартов.
Шифрование - использование ключа для преобразования данных, чтобы его могли понять только те, у кого правильный ключ. Зашифрованные данные могут быть расшифрованы для получения исходных данных. Типичными стандартами являются DES, TDES, AES, RSA и т. Д.
Хеширование - это односторонняя задача создания одного значения из другого. Алгоритм должен попытаться создать максимально короткое и уникальное значение.
запутывание делает что-то нечитаемым без изменения семантики. Он включает в себя преобразование значения, удаление пробелов и т. Д. Некоторые формы запутывания также могут быть односторонними, поэтому невозможно получить начальное значение
шифрование является двусторонним, и всегда существует некоторая расшифровка, работающая наоборот.
Так что, да, вы в основном правы.
Запутывание скрывает или затрудняет понимание чего-либо.
Хеширование принимает входные данные, пропускает их через функцию и генерирует выходные данные, которые могут быть ссылкой на входные данные. Это не обязательно уникально, функция может генерировать один и тот же вывод для разных входов.
Шифрование преобразует вход в выход уникальным способом. Существует взаимно-однозначная корреляция, поэтому нет потенциальной потери данных или путаницы - выход всегда можно преобразовать обратно во вход без двусмысленности.
Запутывание просто усложняет понимание чего-либо, привлекая технику, чтобы запутать кого-то. Обфускаторы кода обычно делают это, переименовывая вещи, чтобы удалить что-либо значимое из имен переменных или методов. Это не похоже на шифрование тем, что для использования ничего не нужно расшифровывать.
Как правило, разница между хешированием и шифрованием заключается в том, что хеширование обычно использует формулу для перевода данных в другую форму, где для шифрования используется формула, требующая ключ (ы) для шифрования / дешифрования. Примерами могут служить кодирование base 64, являющееся алгоритмом хеширования, где md5 - алгоритм шифрования. Любой может разархивировать данные в кодировке Base64, но вы не можете расшифровать зашифрованные данные MD5 без ключа.
Все хорошо, за исключением того, что запутывание не очень похоже на шифрование - иногда оно даже не использует такие простые шифры, как ROT13.