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

Почему MD5's UUID не очень хорошая идея?

В PHP есть функция uniqid(), которая генерирует UUID сорта.

В примерах использования он показывает следующее:

$token = md5(uniqid());

Но в комментариях кто-то говорит об этом:

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

Почему это так, если так? Если хеш MD5 (почти) уникален для уникального идентификатора, то что не так из md5's uniqid?

4b9b3361

Ответ 1

UUID имеет ширину 128 бит и имеет уникальность, присущую способу его создания. Хэш MD5 имеет ширину 128 бит и не гарантирует уникальность, только низкую вероятность столкновения. Хэш MD5 не меньше UUID, поэтому он не помогает при хранении.

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

Если вам нужно предоставить безопасный токен, вам нужно будет использовать криптографически защищенный генератор случайных чисел (1) UUID не разработаны быть криптографически безопасным, только гарантировано уникальным. Монотонно возрастающая последовательность, ограниченная уникальными идентификаторами машины (обычно MAC) и временем, по-прежнему является вполне допустимым UUID, но очень предсказуемым, если вы можете перепроектировать один UUID из последовательности токенов.

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

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

Ответ 2

Обратите внимание, что uniqid() не возвращает UUID, но уникальная строка, основанная на текущее время:

$ php -r 'echo uniqid("prefix_", true);'
prefix_4a8aaada61b0f0.86531181

Если вы делаете это несколько раз, вы получите очень похожие выходные строки, и все, кто знаком с uniqid(), распознают исходный алгоритм. Таким образом, довольно легко предсказать следующие идентификаторы, которые будут сгенерированы.

Преимущество вывода md5(), а также солевой строки приложения или случайного числа, - это сложнее угадать строку:

$ php -r 'echo md5(uniqid("prefix_", true));'
3dbb5221b203888fc0f41f5ef960f51b

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

В заключение я бы не согласился с мнением комментатора и всегда предпочитал вывод md5() -ed поверх plain uniqid().

Ответ 3

MD5ing UUID бессмысленен, поскольку UUID уже уникальны и фиксированы (короткие), свойства, которые являются некоторыми из причин, по которым люди часто используют MD5 для начала. Поэтому я полагаю, что это зависит от того, что вы планируете делать с UUID, но в целом UUID имеет те же свойства, что и некоторые данные, которые были MD5'd, поэтому зачем нужны оба?

Ответ 4

UUID уже уникальны, поэтому в MD5 их нет смысла.

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

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

Ответ 5

Версия 3 UUID уже MD5'd, поэтому нет смысла делать это снова. Однако я не уверен, что использует версия UUID PHP.

Ответ 6

В стороне MD5 фактически устарел и не должен использоваться ни в чем, что стоит защитить - PHI, PII или PCI - с 2010 года. Федеральные правительства США подтвердили это, и любая некоммерческая организация будет платить много штрафов в размере $$$.