alg: drbg: could not allocate DRNG handle for ...
我只在我们创建的虚拟机启动过程中在控制台上看到此错误.编辑:2/5/16 – 我也在一些裸机安装上看到它. (它确实完全启动.)我认为它与虚拟化硬件和缺少(兼容)随机数生成器有关.问题是我无法评估严重程度.加密强度是否受到损害? (我应该关心这个错误吗?)我该如何解决?
我们在CentOS 6.7下使用QEMU / KVM.如果你真的认为它会有所帮助,我可以做一个示例系统的virsh dumpxml.我们使用的是Anaconda default cipher/key size.(aes-xts-plain64 / 512)
这是我在linux-crypto mailing list发现的earliest reference.不幸的是,这有点过头了.
http://www.mail-archive.com/linux-crypto%40vger.kernel.org/msg10398.html
解决方法
我已经检查了源代码,只要我正在解释我正确阅读的内容,你就不必担心这一点.
此代码属于模块“stdrng”.至少在Fedora 23上,它内置于内核中,而不是作为内核模块导出.
首次初始化stdrng时,会发生以下调用.
在crypto / drbg.c初始化从这里开始.
1997 module_init(drbg_init);
这会记录系统已知的所有drbgs.
1985 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++,i++) 1986 drbg_fill_array(&drbg_algs[i],&drbg_cores[j],1); 1987 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++,i++) 1988 drbg_fill_array(&drbg_algs[i],0);
然后它将它传递给执行初始化的辅助函数:
1989 return crypto_register_rngs(drbg_algs,(ARRAY_SIZE(drbg_cores) * 2));
在crypto / rng.c中,这只是遍历每个rng来注册它.
210 for (i = 0; i < count; i++) { 211 ret = crypto_register_rng(algs + i); 212 if (ret) 213 goto err; 214 }
196 return crypto_register_alg(base);
注册期间发生的事情并不那么明显.
内置于内核中的另一个名为tcrypt的模块接收插入新算法的通知.一旦它看到一个新的注册算法,它就会安排对它的测试.这是产生您在屏幕上看到的输出的原因.
测试完成后,算法进入TESTED状态.如果测试失败,我想(我找不到产生这种行为的位)如果传递正确的标志,则无法选择搜索.
测试通过是否绝对是内部存储的.
除此之外,调用psudeo随机数生成器会导致算法列表按强度顺序迭代prng,如crypto / drbg.c中的此注释所示.
107 /* 108 * The order of the DRBG definitions here matter: every DRBG is registered 109 * as stdrng. Each DRBG receives an increasing cra_priority values the later 110 * they are defined in this array (see drbg_fill_array). 111 *
由于最强的一个没有失败(hmac sha256),即使它们可以被选中,你也不太可能使用失败的那些.
总结一下 –
>当某些东西需要stdrng模块时会发生这种情况.
>它加载所有已知的算法.
>加载所有算法进行测试.有些可能会失败(为什么在这个答案中没有考虑).
>测试失败的算法不应该在以后选择.
> PRNGS按强度排序,首先尝试通过的强PRNGS.
>希望依赖stdrng的东西不应该使用这些算法作为其PRNG源的基础.
您可以使用以下命令查看哪些算法已成功并通过了测试:
grep -EC5 'selftest.*passed' /proc/crypto
您还可以使用“优先级”字段查看选择优先级.根据模块作者,值越高,PRNG越强.
所以,我很高兴在这里错了,因为我不认为自己是一个内核程序员,但最后 –
当stdrng加载时,它似乎从可接受的算法列表中选择其他算法,这些算法被认为比失败算法强,加上失败的算法无论如何都不太可能被选中.
因此,我相信在使用luks时这对您没有任何额外的风险.