Является ли Java случайным UUID предсказуемым? - PullRequest
40 голосов
/ 23 сентября 2011

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

Я понимаю, что в Java используется UUID типа 4 с криптографически безопасным генератором случайных чисел, однако я знаю, что UUID не является полностью случайным, поэтому мой вопрос в том, насколько безопасно предполагать, что uuids нельзя предсказать из набора существующих

Ответы [ 3 ]

33 голосов
/ 23 сентября 2011

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

Следующий фрагмент кода взят из OpenJDK7 (и он идентичен OpenJDK6 ):

public static UUID randomUUID() {
        SecureRandom ng = numberGenerator;
        if (ng == null) {
            numberGenerator = ng = new SecureRandom();
        }

        byte[] randomBytes = new byte[16];
        ng.nextBytes(randomBytes);
        randomBytes[6]  &= 0x0f;  /* clear version        */
        randomBytes[6]  |= 0x40;  /* set to version 4     */
        randomBytes[8]  &= 0x3f;  /* clear variant        */
        randomBytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(randomBytes);
    }

Как видите, только 2 из 16 байтов не являются полностью случайными.В шестом байте вы теряете 4 из 8 битов, а в байте 8 вы теряете 2 бита случайности.

Поэтому вы получите 128-битное значение с 122-битной случайностью.

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

3 голосов
/ 23 сентября 2011

Если вы хотите сгенерировать безопасный случайный ключ, я предлагаю вам использовать SecureRandom. Это может генерировать ключ любого количества битов, которые вам требуются. Это медленнее, чем Random, но гораздо безопаснее.

2 голосов
/ 23 сентября 2011

Я всегда думал, что «криптографически безопасный генератор случайных чисел» (на самом деле «криптографически сильный генератор псевдослучайных чисел») Javadoc note отвечает на это.

http://download.oracle.com/javase/1,5.0/docs/api/java/util/UUID.html#randomUUID()

From WhatВикипедия говорит http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator, что такое предсказание будет неполиномиальным алгоритмом.

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

EntropyPool , кажется, помогает с этим, еще не пробовал это http://random.hd.org/ Насколько я понимаю, это давайтеВы скачаете некоторый реальный шум и используете его в своем приложении Java.Однако он не подключен к java.util.UUID api. Возможно, его можно подключить с помощью метода nameUUIDFromBytes (или другого?).

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

...