Я читал этот учебник для простой системы входа в систему PHP .
В конце он рекомендует вам зашифровать ваш пароль, используя md5 () .
Хотя я знаю, что это учебник для новичков, и вы не должны указывать банковские выписки за этой системой входа, это заставило меня задуматься о шифровании.
Поэтому я пошел вперед и пошел (один из самых полезных вопросов, который этот сайт имеет для новичков): Что должен знать разработчик до создания общедоступного веб-сайта?
Там говорится (под защитой):
Шифруйтепароли Hash и salt, а не сохраняйте их в виде обычного текста.
В нем больше не говорится об этом, нет ссылок.
Поэтому я пошел вперед и сам пробовал:
$pass = "Trufa"; $enc = md5($pass); echo $enc; #will echo 06cb51ce0a9893ec1d2dce07ba5ba710
И вот что заставило меня задуматься, что, хотя я знаю, что md5 () не может быть самым сильным способом шифрования, все, что всегда производит один и тот же результат, может быть обратным.
Итак, в чем смысл шифрования чего-либо с помощью md5 () или любого другого метода?
Если хакер получает пароль, зашифрованный с помощью md5 (), он просто будет использовать эту страницу! ,
Итак, теперь актуальные вопросы:
Я знаю, что я не обнаружил огромную уязвимость в Интернете здесь! 🙂 Я просто хочу понять логику шифрования паролей.
Я уверен, что понимаю что-то не так, и был бы признателен, если бы вы могли помочь мне установить мои, хотя и другие (надеюсь) прямо.
Как вы должны применять шифрование паролей, чтобы оно было действительно полезно?
Как я уже сказал, я могу / не понимаю всю идею, но может ли этот метод добавить безопасность в реальную среду?
$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
Я знаю, что это может даже не иметь смысла, но я не могу понять, почему это плохая идея!
Надеюсь, я сделал достаточно ясным, но это очень длинный вопрос, поэтому, пожалуйста, запросите необходимые разъяснения!
Заранее спасибо!!
У вас должно быть 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
в совершенно другой базе данных.
Во-первых, «хеширование» (с использованием криптографической односторонней функции) не «шифруется». При шифровании вы можете отменить процесс (дешифрование). В хешировании существует (теоретически) нецелесообразный способ обращения вспять процесса.
Хеш – некоторая функция f такая, что v не может быть легко определена из f (v).
Точка использования хэширования для аутентификации заключается в том, что вы (или кто-то, кто видит хеш-значение) не имеют возможности (теоретически) знать пароль. Однако вы все равно можете убедиться, что пользователь знает свой пароль. (В принципе, пользователь доказывает, что он знает v, что f (v) является сохраненным хэшем).
Слабость простого хеширования (помимо слабых хеш-функций) заключается в том, что люди могут скомпилировать таблицы паролей и соответствующий им хэш и использовать их (эффективно), чтобы получить обратную хэш-функцию. Соль предотвращает это, потому что тогда контролируется часть входного значения для хеша, и поэтому таблицы должны быть скомпилированы для этой конкретной соли.
Таким образом, практически вы храните соль и значение хеша, а затем проверяете путем хэширования комбинации соли и пароля и сравниваете это с вашим значением хеша.
MD5 – это односторонняя хеширующая функция, которая будет защищать ваш первоначальный пароль более или менее безопасно.
Итак, допустим, ваш пароль – «Trufa», а хешированная версия – 06cb51ce0a9893ec1d2dce07ba5ba710
.
Например, когда вы входите на новую веб-страницу, они запрашивают у вас свое имя пользователя и пароль. Когда вы пишете «Trufa» в качестве пароля, значение 06cb51ce0a9893ec1d2dce07ba5ba710
хранится в базе данных, потому что оно хешировано.
При следующем входе в систему, и вы пишете «Trufa», хешированное значение будет сравниваться с значением в базе данных. Если они одинаковы, вы аутентифицированы! Конечно, вы указали правильное имя пользователя.
Если ваш пароль не был сохранен в его хешированной форме в базе данных, некоторые злоумышленники могут каким-то образом запустить запрос в этой базе данных и посмотреть все настоящие пароли. И это будет компрометировать.
Кроме того, поскольку MD5 является 128-битной криптографической функцией, существуют 2 ^ 128-1 = 340282366920938463463374607431768211455 возможных комбинаций.
Поскольку существует больше возможных строк, возможно, что две строки будут генерировать одно и то же значение хэш-функции. Это называется столкновением. И он гарантирует, что хешированный пароль не может быть однозначно изменен.
Единственная уязвимость с помощью соления заключается в том, что вам нужно знать, что такое соль, чтобы восстановить хеш для проверки пароля. Это получается путем сохранения записи в authdb в форме <algorithm>$<salt>$<hash>
. Таким образом, запись authdb может использоваться любым кодом, который имеет к нему доступ.
Вам не хватает важного шага – соли. Это уникальный (на каждого пользователя, в идеале) бит дополнительных данных, которые вы добавляете к паролю перед его хэшированием.
Ваша идея (соление) хорошо известна и на самом деле хорошо реализована на языке PHP. Если вы используете функцию crypt()
она позволяет указать строку для хеша, метод шифрования (в некоторых случаях) и соль. Например,
$x = crypt('insecure_password', $salt);
Возвращает хешированный и соленый пароль, готовый для хранения. Пароли взломаются так же, как мы проверяем, правильны ли они: мы проверяем хэш того, что пользователь вводит против хэша своего пароля в базе данных. Если они совпадают, они аутентифицируются (AFAIK – это самый распространенный способ сделать это, если не единственный). Небезопасные пароли (например, password
), которые используют словарные слова, могут быть взломаны, сравнивая их хэш с хэшами общих паролей. Безопасные пароли не могут быть взломаны таким образом, но все равно могут быть взломаны. Добавление соли к паролю усложняет процесс взлома: поскольку хакер, скорее всего, не знает, что такое соль, его атака по словарю не будет работать.
Для приличного хэша атакующий не изменит хэш, они будут использовать таблицу радуги, которая по сути является методом грубой силы, полезной, если все используют одну и ту же функцию хэш-функции.
Идея таблицы радуги заключается в том, что, поскольку хеширование происходит быстро, я могу использовать все возможные значения, которые вы могли бы использовать в качестве пароля, сохранить результат и иметь карту, с которой хеш соединяется с каким паролем. Если все просто берут свои пароли и хэшируют их с MD5, тогда моя хеш-таблица хороша для любого набора хэшей паролей. Я могу получить мои руки!
Здесь происходит соление. Если я беру пароль, пользователь вводит и добавляет некоторые данные, которые различны для каждого пользователя, то этот список предварительно определенных хэшей бесполезен, поскольку хэш имеет как пароль, так и некоторые случайные данные. Данные для соли могут храниться рядом с паролем, и даже если я получу оба, это не поможет мне вернуть пароль с тех пор, как мне по-прежнему приходится грубо заставлять хэш отдельно для каждого отдельного пользователя – я не могу сформировать один радужный стол, чтобы сразу атаковать все хеши.
Конечно, в идеале злоумышленник не получит список хешированных паролей, но некоторые сотрудники получат доступ, так что невозможно полностью защитить базу данных паролей.
Помимо предоставления соли (или семян), md5 представляет собой сложный алгоритм хэширования, который использует математические правила для получения результата, который специально не обратим из-за математических изменений и dataloss в пропускной способности.
md5
(или лучше всего: алгоритмы хэша в целом) используются для безопасного хранения паролей в базе данных. Самое важное, что нужно знать о хэшах: Хеши – это не шифрование как таковое. (они не более одного типа шифрования). Если вы что-то зашифруете, вы можете вернуть данные с помощью ключа, который вы использовали. Хэш генерирует значение фиксированной длины из произвольного ввода (например, строки), которое можно использовать для проверки того, использовался ли тот же вход.
Хэши используются для хранения чувствительных, повторно введенных данных на запоминающем устройстве. При этом никто не может воссоздать исходный вход из хеш-данных, но вы можете хэшировать входящий пароль и сравнивать его со значением в базе данных и видеть, совпадают ли оба из них, и если да, то пароль был прав.
Вы уже указали, что существует возможность разбить алгоритм либо с помощью базы данных пар значений / хешей, либо на создание коллизий (разные значения, приводящие к хеш-значению). Вы можете немного скрыть это, используя соль, тем самым модифицируя алгоритм. Но если соль известна, ее можно использовать, чтобы снова разрушить алгоритм.
Мне нравится этот вопрос. Но я думаю, что ты действительно ответил сам.
На сайте, на который вы ссылаетесь, используется поиск в словарях известных, несоленых, md5 – он ничего не «взломает».
Ваш пример почти хорош, за исключением того, что ваше приложение должно иметь возможность регенерировать md5, используя ту же соль каждый раз.
Ваш пример, похоже, использует одну из случайных солей, которая не будет работать 2 раза 3 раза, если вы попытаетесь сравнить хэш пароля пользователя с чем-то введенным.
Люди скажут вам также использовать SHA1 или SHA256, чтобы иметь «сильный» хэш, но люди также будут утверждать, что все они «сломаны».
Эта документация вводит в заблуждение – она учит «уязвимой» концепции и представляет ее как-то «защищенной», потому что она (сохраненный пароль) выглядит как тарабарщина. Просто интернет-хлам, который не умрет. Следующая ссылка должна прояснить ситуацию (вы уже нашли ее немного, хотя, похоже. Хорошая работа.)
Достаточно с таблицами Rainbow: то, что вам нужно знать о схемах Secure Password, говорит о MD5 (и почему его не следует использовать) вместе с солью (например, как пресекать радужные атаки), а также дает полезную информацию (например, «Использовать кого-то» чужой системе паролей. Не создавайте свои собственные "). Это довольно хороший обзор.
Это мой вопрос об аспектах столкновения md5, слегка связанных с вашим вопросом:
Есть ли разница в md5 и sha1 в этой ситуации?
Важная часть находится в первых трех строках, то есть: вы должны поместить свою соль перед паролем, если хотите добиться более сильной защиты, а не после .
Чтобы просто ответить на заголовок вашего вопроса, в настоящее время единственным реальным использованием md5 является хеширование больших строк (например, файлов) для создания контрольных сумм. Они обычно используются, чтобы увидеть, идентичны ли обе строки (в терминах файлов, контрольные суммы часто используются для обеспечения безопасности, чтобы гарантировать, что распространяемый файл не был подделан, например).
Чтобы ответить на каждый из ваших встроенных вопросов:
Как работает шифрование паролей? Как вы должны применять шифрование паролей, чтобы оно было действительно полезно?
Безопасное хеширование паролей работает, вводя пароль в текстовой форме, а затем применяя к нему дорогостоящую функцию хэширования, соленную с криптографически безопасной случайной солью. Более подробно об этом читайте в разделе « Безопасный хеш и соль для PHP-паролей» .
Как насчет этой идеи?
Хеширование паролей не должно быть таким сложным и не должно быть. Избегайте придумывать свои собственные алгоритмы и придерживайтесь уже проверенных алгоритмов хэширования. Поскольку упомянутый выше вопрос упоминает, md5()
для хэширования паролей устарел уже много лет, и поэтому его следует избегать.
Ваш метод создания «случайной» соли из массива из трех разных солей – это не случайность, которую вы ищете. Вам нужна уникальная случайность, которая подходит для криптографической защиты (т. Е. С использованием криптозащищенного генератора псевдослучайных чисел (CSPRNG)). Если вы используете PHP 7 и выше, функция random_bytes может использоваться для создания криптографически безопасной соли (для пользователей PHP 5 может использоваться библиотека random_compat ).