Cryptography 如何判断由QUuid::createUuid()生成的UUID是否基于加密质量的entrophy?

Cryptography 如何判断由QUuid::createUuid()生成的UUID是否基于加密质量的entrophy?,cryptography,qt5,uuid,Cryptography,Qt5,Uuid,从QUuid上的Qt5参考: QUuid QUuid::createUuid()[静态] 在Windows以外的任何平台上,此函数都返回一个新的UUID 使用变量QUuid::DCE和版本QUuid::Random。如果/dev/uradom 如果设备存在,则用于构造UUID的编号将为 加密质量,这将使UUID唯一。否则 UUID的编号将从本地伪随机序列中获得 数字生成器(qrand(),由qsrand()作为种子),它是 通常不具有加密质量,这意味着UUID不能保证是唯一的 在使用/dev/u

从QUuid上的Qt5参考:

QUuid QUuid::createUuid()[静态]

在Windows以外的任何平台上,此函数都返回一个新的UUID 使用变量QUuid::DCE和版本QUuid::Random。如果/dev/uradom 如果设备存在,则用于构造UUID的编号将为 加密质量,这将使UUID唯一。否则 UUID的编号将从本地伪随机序列中获得 数字生成器(qrand(),由qsrand()作为种子),它是 通常不具有加密质量,这意味着UUID不能保证是唯一的

在使用/dev/uradom的平台上,我如何判断/dev/uradom是否可用,以及在运行时该函数是否会使用它

我怀疑我的情况并非如此,因为我运行的这段小代码主要是出于好奇:

while(true){
        QUuid u=QUuid::createUuid();
        QString str=u.toString();
        if(str.contains("2222")){
            qDebug()<<"UUID:"<<str;
            return;
        }
    }
注意第#4行的输出非常奇怪,第3列和第4列中的其他明显对称(第3列开头的4列除外,这是意料之中的)

谢谢

您在第4行的输出几乎肯定是随机的。6 UUID不是一个足够大的样本,无法提供任何随机性指示,如果您确实想知道,您将需要测试大量UUID(比实际可行的多)

关于第3列和第4列,正如您所注意到的,第3列中的前导“4”是预期的,因为它表示UUID版本。第4列中的前导值(b55d,8285,9303,…)也是预期值,但该值为。除了这些值之外,我在第3列和第4列中没有看到任何特定的对称性


为了检查是否使用了
/dev/uradom
qrand()
,quid类不提供此信息,但如果您确实想知道,您可以始终执行quid类的操作,并尝试打开和读取
/dev/uradom
中的数据。不过,我认为这可能是矫枉过正。虽然我当然不会在安全性需要高质量随机数的任何情况下依赖于
qrand()
,但它的实现()可能足以生成UUID。

通常,您可以在控制台上以这种方式尝试它

random="$(dd if=/dev/urandom bs=10 count=1)";
echo $random
如果这给你10个字符,
uradom
正在工作。如果您的设置一切正常,Qt也将使用它

据我所知,这也是一个psedo随机数发生器,它利用系统产生的熵工作。当使用的熵太低时,
/dev/random
会阻塞,而
uradom
会继续为您提供数字

因此,如果您需要依赖绝对安全性,请购买真正的
RNG
。如果您对
/dev/random
的“随机性”感到满意,请使用它。如果您没有创建那么多(可能更多)
uuid,并且没有在系统启动时运行,
uradom
是可以的,但是要小心使用

哦,为什么
/dev/random
/dev/urandom
不是真正的
RNG


仅仅是因为你可以通过重现情境来重现它的输出。如果不精确地观察一个系统,当它的熵被用于如此有趣的事情时,这是不可能的。。。但理论上这是可能的。要实现真正的随机性,你可能需要一个观察量子态的设备。

你是说我第一次运行这个程序时,0000beee-690c-4875-9589-9E2222CEDC只是随机出现的?老兄,我今天应该买几张彩票……我想换个角度看。使用CSPRNG生成16个随机字节,将它们中的6个设置为UUID规范所需的固定值,然后考虑UUID。这是一个非常好的点。然而,这意味着对Qt开发人员施加了一点“同级压力”,要求他们更好地实现这一点。我有点天真。我真的在尝试优化。我希望我广泛部署的应用程序使用可用的“最安全”的RNG,即linux上的/dev/[u]random。内核将通过该()公开它最好的RNG源代码。我的问题只是关于Qt,我如何知道Qt是否在使用它!
random="$(dd if=/dev/urandom bs=10 count=1)";
echo $random