C++:CryptGenRandom 的便携式替代品

问题描述 投票:0回答:3

应用程序的每次启动时,应创建一条 128 位的随机消息,以便该消息之前未被以最大概率选择,并且这也应该是安全的(即不能被某些黑客破坏)。例如,使用带有从系统时间获取的种子的标准随机生成器并不安全,因为它可以通过以某种方式冻结系统时间来破坏(无论如何这可能吗?)。

Windows 函数 CryptGenRandom 似乎适合于此。但有便携式替代品吗?如果没有,Linux和Mac有对应的功能吗?

c++ random cryptography
3个回答
4
投票

Windows 函数 CryptGenRandom 似乎适合于此。但有便携式替代品吗?

这取决于你如何看待它;我不确定是否有一个独立的包装器可以直接包装平台 RNG。但大多数加密库都会有一个随机生成器,它直接引用或(更有可能)从操作系统随机数生成器播种本身。

例如,请在

此处
阅读 Crypto++ 的 AutoSeeded 生成器。这些库从操作系统提供的功能中抽象出来,为您提供了一个可移植的选项,可以最大限度地减少对底层平台的调用(即它们既安全又快)。

如果没有,Linux和Mac有对应的功能吗?

要直接使用加密随机数,请使用

/dev/urandom

。一般来说,没有理由使用可能会阻塞的
/dev/random
。不过,我建议使用经过严格审查的库。


特别是如果您使用嵌入式或虚拟化设备和操作系统,则需要确保操作系统随机数生成器足够随机。例如,对于虚拟化系统,确保为操作系统安装 VM 扩展通常是一个好主意。

额外的种子也可以添加到随机数生成器中,因此,如果您有任何看起来随机的东西,如果您不确定随机数的强度,则将其添加为种子可能是明智的选择。

拥有带有 RNG 扩展(由操作系统或库使用)的 CPU,例如 Intel RD_RAND 当然也可能有意义。


0
投票
使用

getrandom

getrandom() 系统调用将 buf 指向的缓冲区填充为 最多 buflen 随机字节。 这些字节可用于种子用户 空间随机数生成器或用于加密目的。


0
投票
Cymric 库可以跨平台方式处理此问题。

https://github.com/catid/cymric

© www.soinside.com 2019 - 2024. All rights reserved.