Подтвердить что ты не робот

Что такое md5()?

Я читал этот учебник для простой системы входа в систему PHP.

В конце он рекомендует зашифровать ваш пароль, используя md5().

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

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

Там говорится (под безопасностью):

Шифрование Хэш и соляные пароли чем сохранение их обычного текста.

В нем больше не говорится об этом, нет ссылок.

Итак, я пошел вперед и сам пробовал:

$pass = "Trufa";
$enc = md5($pass);

echo $enc; #will echo 06cb51ce0a9893ec1d2dce07ba5ba710

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

Итак, в чем смысл шифрования чего-либо с помощью md5() или любого другого метода?

Если хакер получает пароль, зашифрованный с помощью md5(), он просто будет использовать эту страницу!.

Итак, теперь актуальные вопросы:

  • Как работает шифрование паролей?

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

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

Как вы должны применять шифрование паролей, чтобы оно было действительно полезным?

  1. Как насчет этой идеи?

Как я уже сказал, я могу/не понимаю всю идею, но может ли этот метод добавить безопасность в безопасности к реальной среде?

$reenc = array(
 "h38an",
 "n28nu",
 "fw08d"
 );

$pass = "Trufa";

$enc = chunk_split(md5($pass),5,$reenc[mt_rand(0,count($reenc)-1)]);

echo $enc;

Как вы видите, я случайно добавил произвольные строки ($reenc = array()) к моему паролю md5(), что делает его уникальным ". Это, конечно, просто глупый пример.

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

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

Я знаю, что это может даже не иметь смысла, но я не могу понять, почему это плохая идея!


Надеюсь, я сделал достаточно ясным, но это очень длинный вопрос, поэтому просьба уточнить необходимые разъяснения!

Спасибо заранее!

4b9b3361

Ответ 1

У вас должен быть encryption как md5 или sha512. Вы также должны иметь две различные соли, static salt (написанные вами), а затем также unique salt для этого конкретного пароля.

Пример кода примера (например, registration.php):

$unique_salt = hash('md5', microtime()); 
$password = hash('md5', $_POST['password'].'raNdoMStAticSaltHere'.$unique_salt);

Теперь у вас есть static salt, который действителен для всех ваших паролей, который хранится в файле .php. Затем при выполнении регистрации вы создаете unique hash для этого конкретного пароля.

Все это заканчивается: двумя паролями, которые написаны точно так же, будут иметь два разных hashes. unique hash хранится в database вместе с текущим идентификатором. Если кто-то возьмет database, у них будет каждый unique salt для каждого конкретного пароля. Но то, чего у них нет, это ваш static salt, который делает вещи намного сложнее для каждого "хакера" там.

Вот как вы проверяете правильность своего пароля на login.php, например:

$user = //random username;
$querysalt = mysql_query("SELECT salt FROM password WHERE username='$user'");
while($salt = mysql_fetch_array($querysalt)) {
    $password = hash('md5',
          $_POST['userpassword'].'raNdoMStAticSaltHere'.$salt[salt]);
}

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

Если вы хотите быть более безопасным, вы можете сохранить unique salt в совершенно другой базе данных.

Ответ 2

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

Хеш - некоторая функция f такая, что v не может быть легко определена из f (v).

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

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

Таким образом, вы сохраняете соль и значение хэша и проверяете подлинность, смешивая комбинацию соли и пароля и сравнивая это с вашим значением хеша.

Ответ 3

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

Итак, скажем, ваш пароль - "Trufa" , а хешированная версия - 06cb51ce0a9893ec1d2dce07ba5ba710.

Например, когда вы входите на новую веб-страницу, они запрашивают у вас свое имя пользователя и пароль. Когда вы пишете "Trufa" в качестве пароля, значение 06cb51ce0a9893ec1d2dce07ba5ba710 сохраняется в базе данных, поскольку оно хешировано.

В следующий раз, когда вы входите в систему, и вы пишете "Trufa" , хешированное значение будет сравниваться с значением в базе данных. Если они одинаковы, вы аутентифицированы! Конечно, вы указали правильное имя пользователя.

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

Кроме того, поскольку MD5 является 128-битной криптографической функцией, существуют 2 ^ 128-1 = 340282366920938463463374607431768211455 возможных комбинаций.

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

Ответ 4

Единственная уязвимость с помощью соления заключается в том, что вам нужно знать, что такое соль, чтобы восстановить хэш для проверки пароля. Это происходит, сохраняя запись в authdb в форме <algorithm>$<salt>$<hash>. Таким образом, запись authdb может использоваться любым кодом, который имеет к нему доступ.

Ответ 5

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

http://en.wikipedia.org/wiki/Salt_%28cryptography%29

Ответ 6

Ваша идея (соление) хорошо известна и на самом деле хорошо реализована на языке PHP. Если вы используете функцию crypt(), вы можете указать строку в хэш, метод шифрования (в некоторых случаях) и соль, Например,

$x = crypt('insecure_password', $salt);

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

Ответ 7

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

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

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

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

Ответ 8

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

http://en.wikipedia.org/wiki/Cryptographic_hash_function

Ответ 9

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

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

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

Ответ 10

Мне нравится этот вопрос. Но я думаю, что ты действительно ответил сам.

На сайте, на который вы ссылаетесь, используется поиск в словаре известного, несоленого, md5 - он ничего не "трескает".

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

В вашем примере используется одна из случайных солей, которая будет терпеть неудачу 2 раза 3 раза, если вы попытаетесь сравнить хэш пароля пользователя с чем-то введенным.

Люди скажут вам также использовать SHA1 или SHA256, чтобы иметь "более сильный" хэш, но люди также будут утверждать, что все они "сломаны".

Ответ 11

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

Достаточно с таблицами Rainbow: что вам нужно знать о безопасных схемах пароля говорит о MD5 (и почему его не следует использовать) с солью (например, как пресекать радужные атаки), а также предоставляет полезную информацию (например, "Использовать систему паролей elses. Не создавайте свои собственные" ). Это довольно хороший обзор.

Ответ 12

Это мой вопрос об аспектах столкновения md5, слегка связанных с вашим вопросом:

Есть ли разница между md5 и sha1 в этой ситуации?

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

Ответ 13

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

Чтобы ответить на каждый из ваших встроенных вопросов:

Как работает шифрование паролей? Как вы должны применять шифрование паролей, чтобы оно было действительно полезным?

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

Как насчет этой идеи?

Хеширование паролей не должно быть таким сложным и не должно быть. Избегайте придумывать свои собственные алгоритмы и придерживайтесь уже проверенных алгоритмов хэширования. Как уже упоминалось выше, md5() для хэширования паролей устарел уже много лет, поэтому его следует избегать.

Ваш метод создания "случайной" соли из массива из трех разных солей - это не случайность, которую вы ищете. Вам нужна уникальная случайность, которая подходит для криптографической защиты (т.е. С использованием криптозащищенного генератора псевдослучайных чисел (CSPRNG)). Если вы используете PHP 7 и выше, функция random_bytes может использоваться для создания криптографически безопасной соли (для пользователей PHP 5, можно использовать библиотеку random_compat).