我需要生成随机数据(用于密钥、IV 等),但我似乎找不到正确的方法。
这是背景 - 我正在使用 Visual Studio 在 Windows 上使用 c/c++ 开发我的服务器,并且正在使用 openssl1.0.1c 库。
我正在阅读http://www.openssl.org/docs/crypto/RAND_add.html#上使用 openssl 生成随机数据的文档并偶然发现以下内容 -
"
OpenSSL 确保 PRNG 状态对于每个线程都是唯一的。在提供 /dev/urandom 的系统上,随机设备用于透明地播种 PRNG。但是,在所有其他系统上,应用程序负责通过调用 RAND_add()、RAND_egd(3) 或 RAND_load_file(3) 来播种 PRNG。
当 num == entropy 时,RAND_seed() 等效于 RAND_add()。
RAND_event() 从 Windows 事件(例如鼠标移动和其他用户交互)中收集熵。应该使用发送到窗口过程的所有消息的 iMsg、wParam 和 lParam 参数调用它。它将估计事件消息(如果有)中包含的熵,并将其添加到 PRNG。然后程序可以像往常一样处理这些消息。
RAND_screen() 函数可用于方便 Windows 程序员。它将屏幕的当前内容添加到 PRNG。对于可以捕获 Windows 事件的应用程序,通过调用 RAND_event() 播种 PRNG 是更好的随机源。应该注意的是,这两种方法都不能在没有用户交互的情况下运行的服务器上使用。 "
现在,我的服务器确实在无人值守模式下运行,所以我想我不能使用 Rand_event() 和 Rand_screen() 方法。如何在 Windows 上安全地使用 Rand_bytes() 方法?我还没有带有熵的文件,因此 RAND_load_file() 没有问题,EGD 文档页面上的链接似乎没有 Windows 支持的 EGD。如何确保 openssl 随机数据生成器具有足够的熵,以便我可以使用 Rand_bytes() 生成我的密钥/ivs/salts 等?