2016-04-02 2 views
2

Я видел этот следующий код.использует java.util.UUID после хэширования с md5 хорошим вариантом?

. 
. // some code 
. 
String guid = NetworkUtil.md5(java.util.UUID.randomUUID().toString()) 
. 
. // guid is being used 
. 

Это хороший подход, hashingVersion 4 UUID с MD5?

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

+1

Передача случайного ввода через хеш-функцию эквивалентна простому случайному входу один раз. –

+1

Кстати, это имя переменной 'guid' является неправильным. A [GUID - глобально уникальный идентификатор] (https://en.wikipedia.org/wiki/Globally_unique_identifier) ​​обычно относится к типу UUID, обычно используемому в мире Microsoft. GUID, безусловно, * не * хеш MD5 UUID. Это имя переменной кажется мне красным, что автор этого кода не имел полного понимания. –

+0

@BasilBourque Я согласен с тобой :) –

ответ

4

Давайте начнем с этого:

Согласно спецификации UUID, сама UUID очень хорошо в уникальности генерируемый UUID-х и вероятность столкновения очень очень очень мало.

На самом деле, это не говорит об этом. Он не может этого сказать, потому что это не имеет смысла.

На самом деле, если спецификация UUID говорит о уникальности UUID типа 4, это говорит о том, что они являются только такими же хорошими, как источник случайных чисел. И это зависит от платформы и качества реализации RNG & UUID. Если мы можем предположить идеальный источник случайных чисел, то вероятность того, что любые два (отдельно сгенерированные) UUID будут одинаковыми, включается в 2 ; то есть очень, очень мало. С другой стороны, если у вас плохой источник случайных чисел, вероятность парного столкновения возрастает.

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

Да. Но MD5 - не настоящая проблема.

Как говорит @Doug Stevenson, хеширование UUID не уменьшает вероятность столкновения. Даже для алгоритма хеширования, который не имеет известной слабости. Каким бы ни был алгоритм, существует вероятность того, что хеширующие UUID увеличит вероятность столкновений .

Так что, в общем, нет смысла в хэшировании одного UUID.

Однако, если вам нужен токен с меньшей вероятностью столкновения, чем UUID типа 4, вы можете объединить UUID N типа 4 в один байт-массив и затем создать хэш для массива. Если у вас есть (сильный) алгоритм хеширования M-бит и идеальный источник случайных чисел для вашего генератора UUID, вероятность столкновения должна быть примерно одна в 2 мин (M, 122 * N).


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

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

3

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

+0

Согласен. Предполагая, что реализация 'UUID.randomUUID()' в Android является [криптографически-сильной] (https://en.wikipedia.org/wiki/Strong_cryptography) в отношении генерации случайных чисел как реализации Oracle & OpenJDK, то вы уже получают очень случайное 128-битное значение ([на самом деле 122 бит являются случайными] (https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29)). Хэш MD5 дает вам еще одно 128-битное значение, которое не будет более случайным, особенно с учетом известных [проблем с MD5] (https://en.wikipedia.org/wiki/MD5#Security). –

Смежные вопросы