ar2*_*015 6 c++ random cryptography c++11
我看到很多人std::random_device一起谈论安全问题.
例如,这里是幻灯片22.
据cppreference,std::random_device:
std :: random_device是一个均匀分布的整数随机数生成器,它产生非确定性随机数.
它没有明确谈论安全性.
是否有任何明确提及的有效参考std::random_device对加密是安全的?
不,因为那不是std::random_device设计的目的;它旨在生成随机数,而不是为了确保安全。
在安全性方面,随机性对于密钥生成很有用,但是随机性并不是绝对必要的。例如,AES不使用任何随机性,但是AES-256是用于在美国加密最高机密信息的加密工具。
随机性和安全性交叉的一个领域是生成和使用随机密钥。如果我可以猜出种子并知道所使用的随机协议,那么很有可能我可以使用相同的种子值生成相同的“随机”值,从而生成相同的密钥。
std::random_device如果有硬件模块,它将使用硬件模块(例如硬件TPM),否则将使用操作系统具有的任何功能作为RNG(例如CryptGenRandomWindows或/dev/random* nix系统),甚至可能是PRNG(伪随机数)生成器),它可能会生成相同的数字,具体取决于所使用的随机数算法。附带说明:就像将AES指令集集成到芯片组中以加快加密和解密的速度一样,随着算法被移植到硬件中,硬件RNG有助于提供更大的熵池和更快的随机数生成。
因此,如果您正在使用std::random_device任何形式的加密密钥生成,则需要知道要在要部署到的系统上使用什么随机数生成器,否则可能会发生冲突,从而使加密的系统容易受到重复密钥的影响攻击类型。
希望能对您有所帮助。
TL; DR:仅std::random_device用于为此库中定义的PRNG生成种子.否则,使用加密库(如Crypto ++,Bothan,OpenSSL等)生成安全随机数.
为了了解为什么std::random_device需要,根据定义的上下文来看它是很重要的.
std::random_device是一个的一部分一套被用来生成确定性/伪类和方法随机数字序列快.一个例子 - 也在幻灯片中显示 - 是Mersenne twister算法,它肯定不是加密安全的.
现在这一切都非常好,但由于定义的算法都是确定性的,这可能不是用户可能会追求的:他们想要一个不会一直产生相同流的快速随机数生成器.种子不安全的PRNG 需要某种熵源.这是实施的地方std::random_device,它用于播种Mersenne twister(如答案中提到的幻灯片所示).
std::random_device只要提供非确定性随机数,由此提供的熵源可能很慢.如果它是加密安全的,那么这不会被视为缺点.种子最终没有安全要求 - 毕竟它将用于播种非安全的PRNG.只要它比以毫秒为单位的时间更好,它可能就好了.
对于Mersenne捻线机而言,载玻片显示出约250倍的速度差异,而慢速系统提供了非确定性随机数发生器.这清楚地说明了为什么本地的,确定性的PRNG可以帮助加速随机数生成.请注意,当从多个线程使用时,本地PRNG不会减速.当多个线程访问时,系统生成器可以很快,但这肯定不是给定的.有时系统RNG甚至可能阻止或有延迟或相关问题.
| 归档时间: |
|
| 查看次数: |
2387 次 |
| 最近记录: |