c++ - 在 Windows 上使用 openssl 库生成随 secret 钥/数据

标签 c++ c cryptography openssl

我需要生成随机数据(用于 key 、IV 等),但我似乎找不到正确的方法。

这是背景 - 我正在使用 Visual Studio 在 Windows 上用 C/C++ 开发我的服务器,并使用 openssl1.0.1c 库。

我正在阅读使用 openssl 生成随机数据的文档 http://www.openssl.org/docs/crypto/RAND_add.html#并偶然发现了以下内容 -

"

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() 生成我的 key /ivs/salts 等?

最佳答案

您应该能够简单地调用RAND_bytes,而不必担心初始化。我不确定引用的手册页中的含义,但我怀疑它有点过时了。 OpenSSL 具有针对 RAND_bytes 的操作系统特定初始化代码。例如,v1.0.0c 从 RAND_poll 调用 CryptGenRandom(如果可用)。

不过,检查 RAND_bytes 的返回值可能是有意义的。如果初始化代码未能产生足够的熵,它将返回错误(返回 1 表示成功)。

关于c++ - 在 Windows 上使用 openssl 库生成随 secret 钥/数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10568847/

相关文章:

c - Fflush 文件

java - 无法解密加密文件?

java - 循环条件,最佳实践?

c++ - 仅使用 <iostream> c++ 读取 .csv 文件并存储到数组中

c++ - "bind directly"在引用初始化中是什么意思?

algorithm - 在不削弱密码强度的情况下验证 key 的有效性

php - 这段 PHP 代码是否存在安全漏洞?

C++ 异常、未定义行为和 noexcept

c++ - 请求从 'KanjiCard*' 到非标量类型 'KanjiCard' 的转换(自定义枚举)

C:宏中的预处理器?