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

509

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

  1. Когда использовать хеши против шифрования

  2. Что отличает алгоритм хеширования или шифрования (от теоретического / математического уровня), то есть то, что делает хеши необратимыми (без помощи радуги)

Вот несколько похожих SO вопросов, которые не вдавались в подробности, которые я искал:

В чем разница между обфускацией, хешированием и шифрованием?
Разница между шифрованием и хэшированием

Кенни Кейсон
источник
28
Я могу предвидеть, что это вопрос, к которому следует обращаться, когда люди путают термины. :)
Адам Пейнтер
18
хэширование является односторонним (не может быть отменено), шифрование двусторонним (может быть расшифровано)
bestsss
Хэши также полезны для индексации больших структур и объектов, например файлов. Смотрите хеш-таблицу .
HABO
22
Хэширование похоже на мясорубку. Вы можете превратить корову в гамбургер, но не наоборот.
Нил Макгиган
Я заметил, что мой вопрос был отредактирован. Я всегда знал разницу между двумя уровнями, но мне было более любопытно, что такое низкий уровень / математические различия. :) В любом случае, много хорошего контента для ТАК! Большое спасибо!
Кенни Кейсон

Ответы:

738

Ну, вы можете посмотреть это в Википедии ... Но, так как вам нужно объяснение, я сделаю все возможное здесь:

Хэш-функции

Они обеспечивают отображение между входом произвольной длины и выходом (обычно) фиксированной длины (или меньшей длины). Это может быть что угодно, от простого crc32, до полноценной криптографической хеш-функции, такой как MD5 или SHA1 / 2/256/512. Дело в том, что происходит одностороннее картирование. Это всегда отображение много: 1 (что означает, что всегда будут конфликты), поскольку каждая функция выдает меньший вывод, чем она способна вводить (если вы подадите каждый возможный файл 1 МБ в MD5, вы получите тонну коллизий).

Причина, по которой их трудно (или практически невозможно) изменить, заключается в том, как они работают внутренне. Большинство криптографических хеш-функций многократно повторяют входной набор для получения выходных данных. Поэтому, если мы посмотрим на каждый блок ввода фиксированной длины (который зависит от алгоритма), хеш-функция вызовет это текущее состояние. Затем он будет перебирать состояние, менять его на новое и использовать его в качестве обратной связи для себя (MD5 делает это 64 раза для каждого 512-битного блока данных). Затем он каким-то образом объединяет результирующие состояния всех этих итераций вместе, чтобы сформировать результирующий хеш.

Теперь, если вы хотите декодировать хеш, вам сначала нужно выяснить, как разбить данный хеш на его повторяющиеся состояния (1 возможность для входных данных, меньших, чем размер фрагмента данных, многие для больших входных данных). Тогда вам нужно будет отменить итерацию для каждого состояния. Теперь, чтобы объяснить , почему это очень трудно, представьте себе , пытаясь вывести aи bиз следующей формулы:10 = a + b . Есть 10 положительных комбинаций aи bэто может сработать. Теперь повторим это несколько раз:tmp = a + b; a = b; b = tmp, За 64 итерации у вас будет более 10 ^ 64 возможностей. И это просто простое дополнение, в котором сохраняется состояние от итерации к итерации. Реальные хеш-функции выполняют намного больше одной операции (MD5 выполняет около 15 операций с 4 переменными состояния). А поскольку следующая итерация зависит от состояния предыдущей, а предыдущая уничтожается при создании текущего состояния, практически невозможно определить входное состояние, которое привело к заданному выходному состоянию (для каждой итерации не меньше). Объедините это с большим количеством задействованных возможностей, и для декодирования даже MD5 потребуется почти бесконечное (но не бесконечное) количество ресурсов. Так много ресурсов, что это

Функции шифрования

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

Случаи использования

Используйте хеш-функцию, когда вы хотите сравнить значение, но не можете сохранить простое представление (по любому количеству причин). Пароли должны очень хорошо подходить к этому варианту использования, так как вы не хотите хранить их в виде текста по соображениям безопасности (и не должны). Но что, если вы хотите проверить файловую систему на наличие пиратских музыкальных файлов? Было бы нецелесообразно хранить 3 МБ на музыкальный файл. Вместо этого возьмите хеш файла и сохраните его (md5 будет хранить 16 байтов вместо 3 Мб). Таким образом, вы просто хэшируете каждый файл и сравниваете его с хранимой базой данных хэшей (на практике это не так хорошо работает из-за перекодирования, изменения заголовков файлов и т. Д., Но это пример использования).

Используйте хэш-функцию, когда вы проверяете достоверность входных данных. Вот для чего они предназначены. Если у вас есть 2 элемента ввода и вы хотите проверить, одинаковы ли они, запустите оба с помощью хеш-функции. Вероятность столкновения астрономически мала для небольших входных размеров (при условии хорошей хэш-функции). Вот почему это рекомендуется для паролей. Для паролей длиной до 32 символов у md5 в 4 раза больше свободного пространства. SHA1 имеет 6-кратное выходное пространство (приблизительно). SHA512 имеет примерно в 16 раз больше места на выходе. Тебя не волнует, какой пароль был , ты заботишься, совпадает ли он с тем, который был сохранен. Вот почему вы должны использовать хеши для паролей.

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

Хеш-функции также отлично подходят для подписи данных. Например, если вы используете HMAC, вы подписываете часть данных, беря хеш данных, связанных с известным, но не переданным значением (секретным значением). Итак, вы отправляете простой текст и хэш HMAC. Затем получатель просто хэширует представленные данные с известным значением и проверяет, соответствует ли он переданному HMAC. Если это то же самое, вы знаете, что это не было подделано стороной без секретной ценности. Это обычно используется в защищенных системах cookie-файлов в рамках HTTP, а также при передаче сообщений через HTTP, где требуется некоторая гарантия целостности данных.

Примечание к хэшам для паролей:

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

Добавление соли помогает, так как добавляет немного неизвестных данных в хеш. Таким образом, вместо того, чтобы найти что-либо, что соответствует md5(foo), они должны найти что-то, что при добавлении к известной соли производит md5(foo.salt)(что очень трудно сделать). Но это все еще не решает проблему скорости, так как, если они знают соль, это всего лишь вопрос прохождения словаря.

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

var hash = password + salt;
for (var i = 0; i < 5000; i++) {
    hash = sha512(hash + password + salt);
}

Существуют и другие, более стандартные реализации, такие как PBKDF2 , BCrypt . Но этот метод используется довольно многими системами, связанными с безопасностью (такими как PGP, WPA, Apache и OpenSSL).

Итог, hash(password)не достаточно хорош. hash(password + salt)лучше, но все же недостаточно хорошо ... Используйте механизм растянутых хэшей для создания хэшей паролей ...

Еще одна заметка о тривиальном растяжении

Ни при каких обстоятельствах не передавайте выходные данные одного хеша прямо обратно в хеш-функцию :

hash = sha512(password + salt); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); // <-- Do NOT do this!
}

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

hash1 = sha1(password + salt);

Теперь hash1вероятность столкновения составляет 0,001%. Но когда мы делаем следующее hash2 = sha1(hash1);, все коллизии hash1автоматически становятся коллизиямиhash2 . Итак, теперь у нас есть коэффициент hash1 на уровне 0,001%, и второй sha1()вызов добавляет к этому. Так что теперь hash2вероятность столкновения составляет 0,002%. Это в два раза больше шансов! Каждая итерация добавит еще один 0.001%шанс столкновения к результату. Таким образом, при 1000 итерациях вероятность столкновения подскочила с тривиального до 0,001% до 1%. Теперь ухудшение является линейным, и реальные вероятности намного меньше, но эффект тот же (оценка вероятности одного столкновения с md5составляет около 1 / (2 128 ) или 1 / (3x10) 38).). В то время как это кажется маленьким, благодаря атаке на день рождения это не так уж и мало, как кажется).

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

hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
    hash = sha512(hash + password + salt);
}

Имеет такой же шанс столкновения, как и нативная sha512функция Что ты хочешь? Используйте это вместо этого.

ircmaxell
источник
30
Жаль, что программисты в LinkedIn не читали это до того, как хранили пароли как несоленые хэши SHA1 ... money.cnn.com/2012/06/06/technology/linkedin-password-hack/…
Эрик Дж.
2
@Pacerier: он также делает небольшой акцент на хешировании. Это подробно
расскажет
1
Я не понимаю, как может быть сопоставление 1 к 1, если может быть несколько ключей, приводящих к одному и тому же выводу. Для DES длина ключа составляет 56 бит, а размеры блока - 64 бита. Следовательно, не существует ли 256 различных ключей, которые могут отображаться в один и тот же блок вывода?
mrQWERTY
1
@ Renren29 да. Ты прав. На практике весь шифр не является ни сюръективным, ни инъективным. Однако для данного ключа он сюръективен (каждый простой текст имеет ровно один зашифрованный текст), но не обязательно является инъективным (не у каждого возможного зашифрованного текста есть обратное отображение). Вот почему я сказал, что для данного ключа всегда 1: 1 . Если бы не было нескольких ключей, которые могли бы выводить в один и тот же блок вывода, то шифр был бы бесполезен, поскольку зашифрованный текст сообщал бы вам кое-что о ключе (не зная его).
ircmaxell
7
Отличный ответ. Единственная моя придирка в том, что деградация тривиального растяжения не может быть линейной, иначе она в конечном итоге пройдет 100%. Я думаю, что в вашем примере с 0,001% второй шаг должен быть 0,001 + (1 - 0,001) * 0,001 или 0,001999.
AlexDev
160

Хэш-функция может рассматриваться как выпечка буханки хлеба. Вы начинаете с входных данных (мука, вода, дрожжи и т. Д.), А после применения хеш-функции (смешивание + выпечка) вы получаете результат: буханка хлеба.

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

Множество различных вариантов входов теоретически будут давать идентичные буханки (например, 2 чашки воды и 1 цбп дрожжей дают точно такой же хлеб, как 2,1 стакана воды и 0,9 ц / б дрожжей), но, учитывая один из этих хлебов, вы не можете сказать, именно то, что комбинация входов произвела это.

Шифрование, с другой стороны, может рассматриваться как сейф. Все, что вы положили туда, возвращается обратно, пока у вас есть ключ, с помощью которого он был заперт в первую очередь. Это симметричная операция. Учитывая ключ и некоторый ввод, вы получаете определенный вывод. Учитывая этот вывод и тот же ключ, вы получите исходный ввод. Это отображение 1: 1.

Марк Б
источник
2
За исключением того, что вы не можете легко показать, что конкретный гамбургер целиком и полностью связан с определенной коровой, что является фундаментальным свойством хэша, так что это забавная идея, но ужасная аналогия.
user467257
1
@ Caf LOL действительно и классика в этом. Однако корова вряд ли когда-нибудь попадет на рынок, это «бык», который делает ;-) Корова: молоко. Бык: мясо.
Funk Forty Niner
1
Эта история звучит очень вкусно.
sitilge
44

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

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

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

Простой пример хеширования

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

Пример:

Input    Hash
0010     0
0011     1
0110     1
1000     0

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

Кстати, этот 1-битный хэш не совсем надуманный ... взгляните на бит четности .

Простой пример шифрования

Вы можете зашифровать текст, используя простую подстановку букв, скажем, если ввод A, вы пишете B. Если ввод B, вы пишете C. До конца алфавита, где, если ввод Z, вы напиши еще раз.

Input   Encrypted
CAT     DBU
ZOO     APP

Как и в простом хэш-примере, этот тип шифрования использовался исторически .

Эрик Дж.
источник
Стоит отметить, что «шифрование» в разговорной речи относится к сильному шифрованию и его не следует путать со слабым шифрованием, таким как шифр Цезаря, в приведенном выше примере.
Факс
@ Факс Да, но то, что составляет сильное шифрование, было подвижной планкой на протяжении веков. Немецкую машину загадки Второй мировой войны было почти невозможно взломать (есть отличный фильм об этом). Сегодня ваши умные часы могут легко взломать их. DES когда-то считался сильным, как и MD5. Сегодняшнее надежное шифрование грозит стать легкой добычей технологий квантовых вычислений в обозримом будущем.
Эрик Дж.
Конечно, и это всегда хорошая идея, чтобы проверить даты постов и статей, которые дают советы по криптографии. При этом, я почти уверен, что шифр Цезаря считался слабым даже в 2011 году.
Факс
39

Базовый обзор методов хеширования и шифрования / дешифрования.

Хэш:

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

хеширования


Шифрование и дешифрование:

Если вы зашифровать любой простой текст с ключом снова вы можете получить такую же простой текст , делая расшифровку по зашифрованному тексту с таким же (symetric) ключ / diffrent (asymentric).

шифрование и дешифрование


ОБНОВЛЕНИЕ: чтобы обратиться к пунктам, упомянутым в отредактированном вопросе.

1. Когда использовать хеши против шифрования

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

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


2. Чем отличается хеш или алгоритм шифрования (от теоретического / математического уровня), т.е. что делает хеш необратимым (без помощи радуги)

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

Шифрование / дешифрование (обратимое):

Дополнение :

4 + 3 = 7  

Это может быть полностью изменено, беря сумму и вычитая одно из дополнений

7 - 3 = 4     

Умножение :

4 * 5 = 20  

Это можно изменить, взяв продукт и разделив на один из факторов

20 / 4 = 5    

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


Хеширование (необратимое):

Модульное деление :

22 % 7 = 1   

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

Можете ли вы найти операцию для заполнения, где '?' является?

1  ?  7 = 22  
1  ?  22 = 7

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

кредиты

mrsrinivas
источник
26

Мой один лайнер ... Как правило, интервьюер хотел ответ ниже.

Хеширование - это один из способов. Вы не можете конвертировать ваши данные / строки из хеш-кода.

Шифрование - это 2 способа - вы можете снова расшифровать зашифрованную строку, если у вас есть ключ.

Шив Мохан
источник
Привет! Это две строки.
Марк Сторер
17

Функция хеширования превращает количество переменного размера текста в текст фиксированного размера.

гашиш

Источник: https://en.wikipedia.org/wiki/Hash_function


Хеш-функции в PHP

Хеш превращает строку в хеш-строку. См. ниже.

HASH:

$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e

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

DEHASH:

SHA1 - односторонний хеш. Что означает, что вы не можете дешифровать хеш.

Тем не менее, вы можете перебрать хэш. Пожалуйста, смотрите: https://hashkiller.co.uk/sha1-decrypter.aspx .

MD5, это еще один хеш. Дехашер MD5 можно найти на этом сайте: https://www.md5online.org/ .

Чтобы препятствовать атакам грубой силы на хэши, можно дать соль. В php вы можете использовать password_hash()для создания хэша пароля. Функция password_hash()автоматически создает соль. Для проверки пароля по хешу пароля (с солью) используйте password_verify().

// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';  
$hash = password_hash($password, PASSWORD_DEFAULT);  

echo $hash; 
// OUTPUT 

$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu 

$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u 

$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW

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

$password = '1234';  

$hash = '$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW';  
var_dump( password_verify($password, $hash) );

// OUTPUT 

boolean true 

boolean true 

boolean true




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

Источник: https://en.wikipedia.org/wiki/Encryption


Шифрование в PHP

Давайте углубимся в некоторый код PHP, который обрабатывает шифрование.

--- Расширение Mcrypt ---

ENCRYPT:

$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;

$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);

//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)

дешифрования

$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);

//OUTPUT:
string 'My age is 29' (length=12)

--- Расширение OpenSSL ---

Расширение Mcrypt устарело в версии 7.1. и удалены в php 7.2. Расширение OpenSSL должно использоваться в php 7. См. Фрагменты кода ниже:

$key = 'A_KEY';
$data = 'My age is 29';

// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);

// DECRYPT    
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);

//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)
юлианский
источник
Обратите внимание, что PHP mcrypt уже устарел (возможно, я имел к этому какое-то отношение) и что SHA-1, MD5 и ECB считаются небезопасными. A_KEYэто не AES / Rijndael-128 ключа; это пароль, а не ключ к союзнику.
Мартен Бодевес
@MaartenBodewes Да, это правда. OpenSSL сейчас в моде. php.net/manual/en/book.openssl.php
Джулиан
10

Симметричное шифрование:

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

введите описание изображения здесь

Асимметричное шифрование:

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

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

введите описание изображения здесь

Хэш:

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

введите описание изображения здесь

Узнайте больше здесь: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/

Вахид Фарамандян
источник
Извините, я новичок в области безопасности, но не могли бы вы объяснить, что значит «обычно используется для защиты данных полезной нагрузки»?
Абдул
2
@Abdul Асимметричное шифрование сопряжено с большими вычислительными затратами, поэтому оно не используется для защиты данных, отправляемых по сети в виде пакетов (полезной нагрузки). Вместо этого он используется для установления безопасного сетевого подключения с использованием обмена открытыми ключами для защиты данных.
Счастливчик
5
  1. Используйте хэши, когда вам нужно идти только одним путем. Например, для паролей в системе вы используете хеширование, потому что вы всегда будете проверять, чтобы значение, введенное пользователем после хеширования, соответствовало значению в вашем хранилище. С шифрованием вы можете пойти двумя путями.

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

hvgotcodes
источник
4

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

Многие хеш-функции на самом деле используют алгоритмы шифрования (или примитивы алгоритмов шифрования. Например, кандидат в SHA-3 Skein использует Threefish в качестве базового метода для обработки каждого блока. Разница в том, что вместо сохранения каждого блока зашифрованного текста, они являются деструктивными, детерминистически объединены в фиксированную длину

Джастин морган
источник
4

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

когда дело доходит до авторизации, вы используете хеширование. В хешировании нет ключа

Хеширование берет любой объем данных (двоичный или текстовый) и создает хэш постоянной длины, представляющий контрольную сумму для данных. Например, хеш может быть 16 байтов. Различные алгоритмы хеширования производят хэши разного размера. Очевидно, что вы не можете заново создать исходные данные из хэша, но вы можете снова хэшировать данные, чтобы увидеть, генерируется ли то же самое значение хэша. Так работают односторонние пароли на основе Unix. Пароль хранится в виде значения хэша, и для входа в систему вводимый вами пароль хэшируется, и значение хэша сравнивается с хэшем реального пароля. Если они совпадают, значит, вы ввели правильный пароль

почему хеширование необратимо:

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

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

Криптография имеет дело с числами и строками. В основном каждая цифровая вещь во всей вселенной - это числа. Когда я говорю числа, это 0 и 1. Вы знаете, что они, двоичные. Изображения, которые вы видите на экране, музыка, которую вы слушаете через наушники, все это двоичные файлы. Но наши уши и глаза не поймут двоичные файлы, верно? Только мозг мог понять это, и даже если он мог понимать двоичные файлы, он не мог наслаждаться двоичными файлами. Поэтому мы конвертируем двоичные файлы в понятные человеку форматы, такие как mp3, jpg и т. Д. Давайте назовем процесс как кодирование . Это двухсторонний процесс, который можно легко вернуть обратно в исходную форму.

Хэш

Хеширование - это еще один метод криптографии, в котором данные, однажды преобразованные в какую-либо другую форму, никогда не могут быть восстановлены обратно. По словам Леймана, нет процесса, называемого дешифрованием . Есть много хеш-функций , таких как sha-512, md5 и так далее.

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

Кредиты: wikimedia Применяя хэш к паролю, мы можем гарантировать, что злоумышленник никогда не получит наш пароль, даже если он украл сохраненный файл паролей. У злоумышленника будет хеш пароля. Вероятно, он может найти список наиболее часто используемых паролей и применить sha-512 к каждому из них и сравнить его со значением в своей руке. Это называется атакой по словарю . Но как долго он будет это делать? Если ваш пароль достаточно случайный, как вы думаете, этот метод взлома будет работать? Все пароли в базах данных Facebook, Google и Amazon хешируются, или, по крайней мере, они должны быть хешированы.

Тогда есть шифрование

Шифрование находится между хешированием и кодированием. Кодирование является двусторонним процессом и не должно использоваться для обеспечения безопасности. Шифрование также является двусторонним процессом, но исходные данные могут быть получены тогда и только тогда, когда известен ключ шифрования. Если вы не знаете, как работает шифрование, не беспокойтесь, мы обсудим основы здесь. Этого было бы достаточно, чтобы понять основы SSL. Итак, есть два типа шифрования, а именно симметричное и асимметричное шифрование.

Шифрование симметричного ключа

Я стараюсь сделать все как можно проще. Итак, давайте разберемся в симметричном шифровании с помощью алгоритма сдвига. Этот алгоритм используется для шифрования алфавитов путем смещения букв влево или вправо. Давайте возьмем строку CRYPTO и рассмотрим число +3. Тогда зашифрованный формат CRYPTO будет FUBSWR. Это означает, что каждая буква сдвинута вправо на 3 места. Здесь слово CRYPTO называется Plaintext , выход FUBSWR называется гипертекст , значение +3 называется шифрования ключ (симметричный ключ) , и весь процесс является шифром, Это один из старейших и базовых алгоритмов шифрования с симметричным ключом, и о его первом использовании было сообщено во времена Юлия Цезаря. Итак, его назвали в честь него и это знаменитый Цезарь Шифр . Любой, кто знает ключ шифрования и может применить обратное алгоритму Цезаря и получить исходный открытый текст. Следовательно, это называется симметричным шифрованием .

Асимметричное шифрование ключа

Мы знаем, что в симметричном шифровании один и тот же ключ используется как для шифрования, так и для дешифрования. Как только этот ключ украден, все данные исчезли. Это огромный риск, и нам нужна более сложная техника. В 1976 году Уитфилд Диффи и Мартин Хеллман впервые опубликовали концепцию асимметричного шифрования, и этот алгоритм был известен как обмен ключами Диффи-Хеллмана . Затем в 1978 году Рон Ривест, Ади Шамир и Леонард Адлеман из MIT опубликовали алгоритм RSA . Их можно рассматривать как основу асимметричной криптографии.

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

Источник: SSL / TLS для чайников, часть 1: Ciphersuite, Hashing, Encryption | WST ( https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/ )

Анонимный утконос
источник
-3

Шифрование Цель шифрования состоит в том, чтобы преобразовать данные, чтобы сохранить их в секрете, например (отправка секретного текста, который он только может прочитать, отправка паролей через Интернет).

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

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

Шифрование может выглядеть просто так: FhQp6U4N28GITVGjdt37hZN

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

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

Если хеш неверен и не совпадает с хешем, мы не можем увидеть какую-либо информацию. Например, (MD5, SHA .....)

neevan
источник