k313

Мужчина
Статус
  • Активный

Последние сообщения k313

  • PHP для идиотовБезопасность данных в бд • 23 апреля 2011 г. 21:48

    бытует и обратнопротивоположное мнение, что md5(md5(pass)) имеет больше коллизий, чем просто md5(pass)это мнение можно и проверить и самому (при очень-очень большом желании).md5(); выдаёт нам строку состоящую из 32-х символов, каждый из которых может принимать 16 значений (0-9 a-f).в итоге мы име...
    бытует и обратнопротивоположное мнение, что md5(md5(pass)) имеет больше коллизий, чем просто md5(pass)

    это мнение можно и проверить и самому (при очень-очень большом желании).
    md5(); выдаёт нам строку состоящую из 32-х символов, каждый из которых может принимать 16 значений (0-9 a-f).
    в итоге мы имеем 16 в степени 32, ну примерно 34 c 37-ю нулями, это максимум вариантов для md5();
    Теперь предположим, что алгоритм хеширования в md5 - идеален, т. е. ни один хеш не повториться пока не будут использованы все остальные возможные варианты хешей (ну это конечно фантастика…, а может и нет, это вопрос к математикам).

    Шаг второй: Определяем, максимальную длину хешируемой строки до которой не будет повторений хеша в "идеальном" md5().
    Это примерно что то этокое (функция md5 принимает любые значения байтов (00-FF т. е. 256 значений), к стати crypt() интерпретирует нулевой байт, как окончание строки и следующие за ним символы во внимание не принемает):
    256^1 + 256^2 + 256^3 + ….. остановиться надо будет тогда, когда значение этой суммы достигнет выше подсчитанного значения максимального количества хешей, т.е. 16^32. Ну и конечно мы получим при этом длину хешируемой строки на много меньше, чем 32 символа! (должно равняться 16-и, т. к. хеш в битовом представлении имеет длину 128 бит = 16 байт)
    Из этого видно, что теперь все хешируемые строки которые длинее 16-и символов непременно вызовут коллизию!!!
    А теперь прибавим к нашей хешируемой строке, длиной в 16 символов, у которой ещё не было коллизий (можно сказать "ещё целочка" :)) ещё один символ, который может принимать всего 2 значения: 0 или 1. (ну или можем добавить просто один бит, каму как нравиться). В результате у нашей строки появились НЕ 2-е коллизии! а 256^16 * 2 "штук" коллизий!!!!!!! (т. е. любое изменение в первых 16-и байтах будет приводить к какому-то уже использовавшемуся хешу)
    Какая "не маленькая" цифра и это только из-за одного "лишнего" бита в строке…..

    И вот теперь время ответа на вопрос:
    бытует и обратнопротивоположное мнение, что md5(md5(pass)) имеет больше коллизий, чем просто md5(pass)

    Что мы получаем при первом хешировании??? правильно! строку длиной в 32 байта! а затем мы эту строку хешируем второй раз ожидая, что результат превзойдёт все ожидания. Во как!!! У кого нибудь есть желание подсчитать колличество коллизий для строки в 32 байта???




    Тааак… Куём железо пока горячё! (пока из другого уха всё не вылетело)
    Из выше сказанного напрашивается ВЫВОД:
    нет смысла задавать пароли длинее 16 байт! (это для md5)
    для sha1 - 20 байт. (именно поэтому его применять предпочтительней, т.к. "радужная таблица" возрастает где то в 256^4 раза)
    Так же повторю, что от "простых и коротких паролей" Вас не спасёт ни sha1, ни sha2, ни sha3000 (которая появиться в 3000-ом году…) потому как их (пароли) перебирают в первую очередь, как V.I.P.-пароли. :)
    .
    .
    .
    Какой можно найти выход??? или как обычно задают гуглу: "как лучше зашифровать пароль".
    Ну тут уже надо самому "выкручиваться". Как например "соль" и "извращения" при хешировании пароля. При этом "соль" для каждого узера своя и прятать её не в БД, а вообще как можно дальше.
    .
    .
    .
    А это для тех, кто помешен на безопасности…
    Представляем себе ситуацию:
    вы старались, писали, как вам кажется, просто "Афффффигенный" код, всё как положено, с "солью", с "извращениями", пароль себе придумали такой "i0df+wejtRc!777", что хрен выговаришь и Слава Богу, пошли спать со спокойной душой, будучи уверенным, что ваша "крепость" не приступна…..
    А утром просыпаетесь, БАХ! а ваш аккаунт взломали??????? =O
    "Как же так? как же так???" - А оказалось, что хеш вашего пароля "i0df+wejtRc!777" и хеш пароля "123456" ОДИН И ТОТ ЖЕ! Ха ха…
    Выбирая себе пароль ни когда не знаешь, а кому ещё он окажется "братом родным". А всё благодаря хешированию! Ведь сравнение паролей "123456" и "i0df+wejtRc!777" в "голом" виде ни когда бы не вернуло "true".
    Ну что? будем искать выход и из таких ситуаций??? Мы же (в смысле "помешанные на защите") стремимся создать 100%-ю защиту!!!
    .
    .
    .
    Ну да… мечтать не вредно, говорят.
    А вопрос, "Как же лучше?" остался открытым. Да он и вряд ли когда закроется.
    А в чём слабость md5();? (ну или sha1, не важно) Вроде всё хорошо делает, преобразовывает строку до неузнаваемости, логики обратного преобразования в исходный текст нет, длина хеша вроде уже как и так приличная. А слабость всё же есть. И состоит она в том, что логика хеширования ВСЕМ ИЗВЕСТНА! т. е. любой кто её знает просто повторяет её и получает вполне жизнеспособную таблицу хешей. Какой напрашивается вывод? Да в общем то не такой уж и сложный. Нужно писать свои функции хеширования и это не так уж и сложно! Ведь всё что требуется от этой функции - это то, чтобы исходный текст был изменён до неузнаваемости и метода обратного преобразования чтоб не было.
    И тогда наверняка, вдруг запляшут облака… Теперь если хакер получил ваши хеши, ему просто нечем хешировать для создания таблицы. Потому, что такова метода, каким вы хешировали ваши пароли, больше на всём белом свете нет! И он, хакер, не сможет создать таблицу, пока не получит исходный код вашего скрипта с вашей функцией. А если вы немного постараетесь, и напишете функцию действительно необратимого хеширования, то тогда хакеру действительно придётся делать всё самому (в смысле с нуля создавать "радужную таблицу"), а использовали бы вы md5 - он бы просто отослал ваши хеши на какой нибудь сайт где хранят хеши от md5 и через 0,3 сек. у него был бы ответ… А так ему придётся помучиться, и может даже не один день, а может ещё и бабки потратит на железо… А вы взяли на следующий день да и изменили в вашей функции одну циферку!!! А так как она стояла в функции не самой последненькой, то теперь и хеши стали совсем по другому выглядеть. Хы-ы-ыыы!!! А узерам своим сгенерируете и отошлёте новые пароли (ни чё, потерпят, не каждый день такое случается)

    =)
    =)
    =)
    =)

    Короче говоря, "На других надейся, да и сам не плошай"!
    Удачи!
  • PHP для идиотовБезопасность данных в бд • 23 апреля 2011 г. 17:09