我看到很多人一起谈论安全性和std::random_device
。
例如,here幻灯片22。
根据cppreference,std::random_device
:
std :: random_device是一个均匀分布的整数随机数生成器,可生成非确定性随机数。
它没有明确谈论安全性。
是否有明确提及std::random_device
的有效参考对加密是安全的?
答案 0 :(得分:6)
不,因为那不是std::random_device
的目的;它旨在生成随机数,而不是安全的。
在安全性的上下文中,随机性对于密钥生成是有用的,但随机性不是绝对需要的。例如,AES不使用任何随机性,但AES-256是用于加密美国最高机密信息的。
随机性和安全性交叉的一个领域是生成和使用随机密钥时;如果我能猜出种子并知道所使用的随机协议,我很有可能然后使用相同的种子值来生成相同的"随机"价值,因此相同的关键。
std::random_device
将使用硬件模块(如硬件TPM)(如果有),否则它将使用操作系统作为RNG的任何内容(如Windows中的CryptGenRandom
或* nix系统中的/dev/random
,甚至可能是PRNG(伪随机数生成器),它可能根据所使用的随机数算法生成相同的数字。作为旁注:非常类似于AES instruction set如何被整合到芯片组中以加速加密和解密,hardware RNG's有助于在算法移入硬件时提供更大的熵池和更快的随机数生成。
因此,如果您在任何类型的加密密钥生成中使用std::random_device
,您需要知道正在部署的系统上使用的是什么随机数生成器,否则您可能会发生冲突因此,您的加密系统可能容易受到重复密钥类型的攻击。</ p>
希望可以提供帮助。
答案 1 :(得分:5)
TL; DR:仅使用std::random_device
为此库中定义的PRNG生成种子。否则,使用加密库(如Crypto ++,Bothan,OpenSSL等)生成安全随机数。
要知道为什么需要std::random_device
,根据定义它的上下文来看它是很重要的。
std::random_device
是set of classes and methods that are used to generate deterministic/pseudo random number sequences fast的一部分。一个例子 - 也在幻灯片中显示 - 是Mersenne twister算法,它当然不是加密安全的。
现在这一切都非常好,但由于定义的算法都是确定性的,这可能不是用户可能会追求的:他们想要一个不会一直产生相同流的快速随机数生成器。 种子不安全的PRNG需要某种熵源。这是std::random_device
开始行动的地方,它用于播种Mersenne twister(如答案中提到的幻灯片所示)。
std::random_device
提供的此熵源可能很慢,只要它提供非确定性随机数。 如果它是加密安全的,那么这不会被视为一个缺点。种子最终没有安全要求 - 毕竟它将用于播种非安全的PRNG。只要它比以毫秒为单位的时间更好,它可能就好了。
幻灯片显示梅森捻线机的速度差约250倍,慢速系统提供非确定性随机数发生器。这清楚地说明了为什么本地的,确定性的PRNG可以帮助加速随机数生成。请注意,当从多个线程使用时,本地PRNG不会减速。当多个线程访问时,系统生成器可以快速,但这肯定不是给定的。有时系统RNG甚至可能阻止或有延迟或相关问题。