Я вижу много путаницы между хэшами и алгоритмами шифрования, и я хотел бы услышать еще несколько советов экспертов о:
Когда использовать хеши против шифрования
Что отличает алгоритм хеширования или шифрования (от теоретического / математического уровня), то есть то, что делает хеши необратимыми (без помощи радуги)
Вот несколько похожих SO вопросов, которые не вдавались в подробности, которые я искал:
В чем разница между обфускацией, хешированием и шифрованием?
Разница между шифрованием и хэшированием
security
encryption
hash
cryptography
Кенни Кейсон
источник
источник
Ответы:
Ну, вы можете посмотреть это в Википедии ... Но, так как вам нужно объяснение, я сделаю все возможное здесь:
Хэш-функции
Они обеспечивают отображение между входом произвольной длины и выходом (обычно) фиксированной длины (или меньшей длины). Это может быть что угодно, от простого 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)
(что очень трудно сделать). Но это все еще не решает проблему скорости, так как, если они знают соль, это всего лишь вопрос прохождения словаря.Итак, есть способы борьбы с этим. Один из популярных методов называется усилением ключа (или растяжением ключа). По сути, вы перебираете хеш много раз (обычно тысячи). Это делает две вещи. Во-первых, это значительно замедляет время выполнения алгоритма хеширования. Во-вторых, если реализовано правильно (передача входных данных и соли обратно на каждой итерации) фактически увеличивает энтропию (доступное пространство) для выходных данных, уменьшая вероятность столкновений. Тривиальная реализация:
Существуют и другие, более стандартные реализации, такие как PBKDF2 , BCrypt . Но этот метод используется довольно многими системами, связанными с безопасностью (такими как PGP, WPA, Apache и OpenSSL).
Итог,
hash(password)
не достаточно хорош.hash(password + salt)
лучше, но все же недостаточно хорошо ... Используйте механизм растянутых хэшей для создания хэшей паролей ...Еще одна заметка о тривиальном растяжении
Ни при каких обстоятельствах не передавайте выходные данные одного хеша прямо обратно в хеш-функцию :
Причина этого связана с столкновениями. Помните, что все хеш-функции имеют коллизии, потому что возможное выходное пространство (количество возможных выходных данных) меньше, чем входное пространство. Чтобы понять почему, давайте посмотрим, что происходит. Чтобы предварить это, давайте сделаем предположение, что вероятность столкновения составляет 0,001%
sha1()
( в реальности это намного ниже, но для демонстрационных целей).Теперь
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).). В то время как это кажется маленьким, благодаря атаке на день рождения это не так уж и мало, как кажется).Вместо этого, повторно добавляя соль и пароль каждый раз, вы снова вводите данные обратно в хеш-функцию. Таким образом, любые столкновения любого конкретного раунда больше не являются столкновениями следующего раунда. Так:
Имеет такой же шанс столкновения, как и нативная
sha512
функция Что ты хочешь? Используйте это вместо этого.источник
Хэш-функция может рассматриваться как выпечка буханки хлеба. Вы начинаете с входных данных (мука, вода, дрожжи и т. Д.), А после применения хеш-функции (смешивание + выпечка) вы получаете результат: буханка хлеба.
Идти по другому пути чрезвычайно сложно - вы не можете по-настоящему разделить хлеб обратно на муку, воду, дрожжи - часть этого была потеряна в процессе выпечки, и вы никогда не сможете точно сказать, сколько воды, муки или дрожжей было использовано для конкретная буханка, потому что эта информация была уничтожена функцией хеширования (она же печь).
Множество различных вариантов входов теоретически будут давать идентичные буханки (например, 2 чашки воды и 1 цбп дрожжей дают точно такой же хлеб, как 2,1 стакана воды и 0,9 ц / б дрожжей), но, учитывая один из этих хлебов, вы не можете сказать, именно то, что комбинация входов произвела это.
Шифрование, с другой стороны, может рассматриваться как сейф. Все, что вы положили туда, возвращается обратно, пока у вас есть ключ, с помощью которого он был заперт в первую очередь. Это симметричная операция. Учитывая ключ и некоторый ввод, вы получаете определенный вывод. Учитывая этот вывод и тот же ключ, вы получите исходный ввод. Это отображение 1: 1.
источник
Используйте хеши, если вы не хотите иметь возможность вернуть исходный ввод, используйте шифрование, когда вы это делаете.
Хэши берут некоторый ввод и превращают его в несколько бит (обычно это число, например 32-битное целое, 64-битное целое и т. Д.). Один и тот же ввод всегда будет давать один и тот же хеш, но вы ПРИНЦИПНО теряете информацию в процессе, поэтому вы не можете надежно воспроизвести исходный ввод (однако, есть несколько предостережений).
Шифрование в основном сохраняет всю информацию, которую вы вводите в функцию шифрования, просто затрудняет (в идеале невозможное) возвращение к исходному вводу без специального ключа.
Простой пример хеширования
Вот тривиальный пример, который поможет вам понять, почему хеширование не может (в общем случае) вернуть исходные данные. Скажем, я создаю 1-битный хэш. Моя хэш-функция принимает строку битов в качестве входных данных и устанавливает хэш на 1, если во входной строке задано четное количество битов, или 0, если было нечетное число.
Пример:
Обратите внимание, что есть много входных значений, которые приводят к хешу 0, и многие, которые приводят к хешу 1. Если вы знаете, что хэш равен 0, вы не можете точно знать, каким был исходный ввод.
Кстати, этот 1-битный хэш не совсем надуманный ... взгляните на бит четности .
Простой пример шифрования
Вы можете зашифровать текст, используя простую подстановку букв, скажем, если ввод A, вы пишете B. Если ввод B, вы пишете C. До конца алфавита, где, если ввод Z, вы напиши еще раз.
Как и в простом хэш-примере, этот тип шифрования использовался исторически .
источник
Базовый обзор методов хеширования и шифрования / дешифрования.
ОБНОВЛЕНИЕ: чтобы обратиться к пунктам, упомянутым в отредактированном вопросе.
источник
Мой один лайнер ... Как правило, интервьюер хотел ответ ниже.
Хеширование - это один из способов. Вы не можете конвертировать ваши данные / строки из хеш-кода.
Шифрование - это 2 способа - вы можете снова расшифровать зашифрованную строку, если у вас есть ключ.
источник
Функция хеширования превращает количество переменного размера текста в текст фиксированного размера.
Источник: https://en.wikipedia.org/wiki/Hash_function
Хеш-функции в PHP
Хеш превращает строку в хеш-строку. См. ниже.
HASH:
Пароли обычно хранятся в своем хешированном представлении, а не как читаемый текст. Когда конечный пользователь хочет получить доступ к приложению, защищенному паролем, во время аутентификации необходимо указать пароль. Когда пользователь отправляет свой пароль, действительная система аутентификации получает пароль и хэширует данный пароль. Этот хэш пароля сравнивается с хэшем, известным в системе. Доступ предоставляется в случае равенства.
DEHASH:
SHA1 - односторонний хеш. Что означает, что вы не можете дешифровать хеш.
Тем не менее, вы можете перебрать хэш. Пожалуйста, смотрите: https://hashkiller.co.uk/sha1-decrypter.aspx .
MD5, это еще один хеш. Дехашер MD5 можно найти на этом сайте: https://www.md5online.org/ .
Чтобы препятствовать атакам грубой силы на хэши, можно дать соль. В php вы можете использовать
password_hash()
для создания хэша пароля. Функцияpassword_hash()
автоматически создает соль. Для проверки пароля по хешу пароля (с солью) используйтеpassword_verify()
.Один пароль может быть представлен более чем одним хешем. Когда вы проверяете пароль с помощью других хэшей паролей с помощью
password_verify()
, тогда пароль будет принят в качестве действительного пароля.Функция шифрования преобразует текст в бессмысленный шифротекста с помощью ключа шифрования, и наоборот.
Источник: https://en.wikipedia.org/wiki/Encryption
Шифрование в PHP
Давайте углубимся в некоторый код PHP, который обрабатывает шифрование.
--- Расширение Mcrypt ---
ENCRYPT:
дешифрования
--- Расширение OpenSSL ---
Расширение Mcrypt устарело в версии 7.1. и удалены в php 7.2. Расширение OpenSSL должно использоваться в php 7. См. Фрагменты кода ниже:
источник
A_KEY
это не AES / Rijndael-128 ключа; это пароль, а не ключ к союзнику.Симметричное шифрование:
Симметричное шифрование также может называться общим ключом или общим секретным шифрованием. При симметричном шифровании один ключ используется как для шифрования, так и для дешифрования трафика.
Асимметричное шифрование:
Асимметричное шифрование также известно как криптография с открытым ключом. Асимметричное шифрование отличается от симметричного шифрования прежде всего тем, что используются два ключа: один для шифрования и один для дешифрования. Наиболее распространенным алгоритмом асимметричного шифрования является
RSA
.По сравнению с симметричным шифрованием асимметричное шифрование накладывает большие вычислительные затраты и имеет тенденцию быть намного медленнее. Таким образом, он обычно не используется для защиты данных полезной нагрузки. Вместо этого его основной силой является способность устанавливать безопасный канал через небезопасную среду (например, Интернет). Это достигается путем обмена открытыми ключами, которые могут использоваться только для шифрования данных. Дополнительный закрытый ключ, который никогда не передается, используется для расшифровки.
Хэш:
Наконец, хеширование - это форма криптографической защиты, которая отличается от шифрования. Принимая во внимание, что шифрование - двухэтапный процесс, используемый, чтобы сначала зашифровать и затем расшифровать сообщение, хеширование конденсирует сообщение в необратимое значение фиксированной длины, или хэш. Два наиболее распространенных алгоритма хеширования, наблюдаемые в сети, - это
MD5
иSHA-1
.Узнайте больше здесь: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/
источник
Используйте хэши, когда вам нужно идти только одним путем. Например, для паролей в системе вы используете хеширование, потому что вы всегда будете проверять, чтобы значение, введенное пользователем после хеширования, соответствовало значению в вашем хранилище. С шифрованием вы можете пойти двумя путями.
алгоритмы хеширования и алгоритмы шифрования - это всего лишь математические алгоритмы. Так что в этом отношении они ничем не отличаются - это всего лишь математические формулы. Однако в отношении семантики существует очень большое различие между хешированием (односторонним) и шифрованием (двусторонним). Почему хеши необратимы? Потому что они разработаны таким образом, потому что иногда вам нужна односторонняя операция.
источник
Алгоритмы шифрования и хеширования работают аналогичным образом. В каждом случае существует необходимость создавать путаницу и распространение среди битов. Сложность, путаница создает сложные отношения между ключом и зашифрованным текстом и распространением распространяет информацию каждого бита вокруг.
Многие хеш-функции на самом деле используют алгоритмы шифрования (или примитивы алгоритмов шифрования. Например, кандидат в SHA-3 Skein использует Threefish в качестве базового метода для обработки каждого блока. Разница в том, что вместо сохранения каждого блока зашифрованного текста, они являются деструктивными, детерминистически объединены в фиксированную длину
источник
когда дело доходит до безопасности для передачи данных, т.е. при двусторонней связи вы используете шифрование. Все шифрование требует ключа
когда дело доходит до авторизации, вы используете хеширование. В хешировании нет ключа
Хеширование берет любой объем данных (двоичный или текстовый) и создает хэш постоянной длины, представляющий контрольную сумму для данных. Например, хеш может быть 16 байтов. Различные алгоритмы хеширования производят хэши разного размера. Очевидно, что вы не можете заново создать исходные данные из хэша, но вы можете снова хэшировать данные, чтобы увидеть, генерируется ли то же самое значение хэша. Так работают односторонние пароли на основе Unix. Пароль хранится в виде значения хэша, и для входа в систему вводимый вами пароль хэшируется, и значение хэша сравнивается с хэшем реального пароля. Если они совпадают, значит, вы ввели правильный пароль
почему хеширование необратимо:
Хеширование необратимо, потому что отображение ввода в хэш не 1 к 1. Наличие двух входов, отображаемых на одно и то же значение хеша, обычно называется «коллизией хешей». В целях безопасности одно из свойств «хорошей» хеш-функции заключается в том, что при практическом использовании коллизии встречаются редко.
источник
Криптография имеет дело с числами и строками. В основном каждая цифровая вещь во всей вселенной - это числа. Когда я говорю числа, это 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/ )
источник
источник