如何判断由QUuid::createUuid()生成的UUID是否基于加密质量的entrophy?
-
21-12-2019 - |
题
来自QUuid上的Qt5参考:
QUuid QUuid::createUuid()[静态]
在Windows以外的任何平台上,此函数返回一个新的UUID 具有变体QUuid::DCE和版本QUuid::Random。如果/dev/urandom 设备存在,那么用于构造UUID的数字将是 密码质量,这将使UUID唯一。否则, UUID的数字将从本地伪随机获得 数字生成器(qrand(),由qsrand()播种) 通常不具有cryptograhic质量,这意味着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列中的其他明显对称性(除了第3列开头的4列是预期的)。
谢谢!
解决方案
你在第4行的输出几乎肯定只是随机的机会。6Uuid不是一个足够大的样本来提供任何随机性的指示,如果你真的想确定你需要测试大量的Uuid(比现实可行的更多)。
关于第3列和第4列,正如您已经注意到的那样,第3列中的前导"4"是预期的,因为它表示UUID版本。第4列中的前导值(b 55d, 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也会使用它。
据我所知,这也只是一个psedo随机数生成器,与系统生成的熵一起工作。而 /dev/random
使用熵太低时的块, urandom
继续给你数字。
所以如果你需要依靠绝对的安全,买一个真正的 RNG
.如果你对 /dev/random
, ,使用它。如果你没有创造那么多(数百万可能更多) uuids
而不是在系统启动时运行, urandom
很好,但要小心使用。
哦,为什么 /dev/random
和 /dev/urandom
不是真的 RNG
?
仅仅是因为你可以通过再现情况来再现它的输出。如果没有精确地观察一个系统,而它的熵被用于这样的乐趣,这是不可能的。..但理论上它是可能的。对于真正的随机性,您可能希望有一个观察量子态的设备。