Как я могу определить, основан ли UUID, сгенерированный QUuid::createUuid(), на энтрофии криптографического качества?

StackOverflow https://stackoverflow.com//questions/25038169

  •  21-12-2019
  •  | 
  •  

Вопрос

Из ссылки Qt5 на QUuid:

QUuid QUuid::createUuid() [статический]

На любой платформе, отличной от Windows, эта функция возвращает новый UUID с вариантом Quuid :: dce и версия Quuid :: random.Если существует устройство /dev /urandom, то цифры, используемые для построения UUID, будут иметь криптографическое качество, что сделает UUID уникальным.В противном случае количество UUID будет получено из локального генератора псевдолупирного числа (qrand (), который высечен qsrand ()), который обычно не имеет криптографического качества, что означает, что UUID не может гарантировать быть уникальный.

На платформе с /dev/urandom как я могу определить, действительно ли /dev/urandom доступен и будет ли использоваться этой функцией при ее запуске?

Подозреваю, что в моем случае это было не так, судя по небольшому коду, который я выполнил главным образом ради любопытства:

while(true){
        QUuid u=QUuid::createUuid();
        QString str=u.toString();
        if(str.contains("2222")){
            qDebug()<<"UUID:"<<str;
            return;
        }
    }

Когда я запускал его несколько раз, это дало следующий результат:

 1 UUID: "{8b42222b-bac3-4c93-b55d-0255a33115a2}"
 2 UUID: "{5122227e-473e-4885-8285-8780cc51f71a}"
 3 UUID: "{bfeed28f-f8da-4a69-9303-77388752222e}"
 4 UUID: "{0000beee-690c-4875-9589-9e222222cedc}"
 5 UUID: "{e5a2646d-1c81-4974-94ad-8b222265b67a}"
 6 UUID: "{bb77d756-6726-4e9f-94d8-3d4892222a2f}"

Обратите внимание на довольно причудливый результат в строке № 4 и на другие очевидные симметрии в 3-м и 4-м столбцах (за исключением цифры 4 в начале столбца 3, чего и следовало ожидать).

Спасибо!

Это было полезно?

Решение

enter image description here

Ваш вывод в строке 4 почти наверняка является просто случайностью.6 UUID — это недостаточно большая выборка, чтобы обеспечить какие-либо признаки случайности, и если вы действительно хотите знать наверняка, вам придется протестировать огромное количество UUID (больше, чем реально возможно).

Что касается столбцов 3 и 4, как вы заметили, в третьем столбце ожидается начальная цифра «4», поскольку она указывает версию UUID.Ведущее значение в 4-м столбце (б 55д, 8 285, 9 303, ...), хотя также ожидается, что это значение всегда будет 8, 9, a или b.За пределами этих значений я не вижу особой симметрии в 3-м и 4-м столбцах.

Для проверки, если /dev/urandom или qrand() использовался класс QUuid не делает эту информацию доступной, но если вы действительно хотите знать, вы всегда можете сделать то же, что и класс QUuid, и попытаться открыть и прочитать данные из /dev/urandom.Хотя я бы сказал, что это, наверное, излишество.Хотя я бы, конечно, не стал полагаться на qrand() в любой ситуации, когда для безопасности необходимы качественные случайные числа, их реализация (учитывая, как он заполняется, ~строка 959), вероятно, достаточно хорош для генерации UUID.

Другие советы

В общем, можно попробовать на консоли вот так

random="$(dd if=/dev/urandom bs=10 count=1)";
echo $random

Если это дает вам 10 символов, urandom работает.Если с вашей настройкой все в порядке, Qt также будет ее использовать.

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

Так что если вам нужно положиться на абсолютную безопасность, купите настоящий RNG.Если вас устраивает «случайность» /dev/random, используй это.Если вы не создаете так много (может быть, миллионы) uuids и не запускается при запуске системы, urandom это нормально, но использовать с осторожностью.

Ну почему /dev/random и /dev/urandom это не настоящий RNG ?

Просто потому, что вы можете воспроизвести его результат, воспроизведя ситуацию.Что ж, это будет невозможно без точного наблюдения за системой, пока ее энтропия используется для такого развлечения...но теоретически это возможно.Для реальной случайности вам может понадобиться устройство, наблюдающее за квантовыми состояниями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top