【问题标题】:Generating random keys/data using openssl library on Windows在 Windows 上使用 openssl 库生成随机密钥/数据
【发布时间】:2012-05-21 01:58:48
【问题描述】:

我需要生成随机数据(用于密钥、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。然后程序可以像往常一样处理这些消息。

为了方便 Windows 程序员,可以使用 RAND_screen() 函数。它将屏幕的当前内容添加到 PRNG。对于可以捕获 Windows 事件的应用程序,通过调用 RAND_event() 播种 PRNG 是更好的随机源。 需要注意的是,这两种方法都不能在没有用户交互的情况下运行的服务器上使用。 "

现在,我的服务器确实在无人值守模式下运行,所以我想我不能使用 Rand_event() 和 Rand_screen() 方法。如何在 Windows 上安全地使用 Rand_bytes() 方法?我还没有带有熵的文件,所以 RAND_load_file() 是没有问题的,EGD 文档页面上的链接似乎没有 Windows 支持的 EGD。如何确保 openssl 随机数据生成器具有足够的熵,以便我可以使用 Rand_bytes() 生成我的密钥/ivs/salt 等?

【问题讨论】:

    标签: c++ c cryptography openssl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你可以试试EGDW(Windows 的熵收集守护进程)

      【讨论】:

        猜你喜欢
        • 2012-11-15
        • 2018-09-10
        • 2017-11-20
        • 2015-09-27
        • 2019-08-09
        • 2018-01-12
        • 1970-01-01
        • 2014-07-20
        • 2018-01-27
        相关资源
        最近更新 更多