OpenSSl RAND_bytes 由于缺乏不可预测性而返回错误的频率如何?

mat*_*usa 5 c++ openssl

RAND_bytes 的文档声称,如果生成的随机字节是可预测的,该函数可能会返回错误。我的问题是此类错误发生的频率如何?

可以在有限循环中调用 RAND_bytes (例如 5 次尝试),然后抛出异常是解决此问题的合理方法,或多或少像这样:

    unsigned char random_bytes[4];
    uint8_t attempts = 0;
    while(RAND_bytes(random_bytes,sizeof(random_bytes)) != 1 && ++attempts != 5 ) { }
    if( attempts == 5)
    {
        throw std::runtime_error("random bytes too predictable after multiple attempts");
    }
Run Code Online (Sandbox Code Playgroud)

或者这个循环很愚蠢,我应该在第一次尝试后抛出?

谢谢。

mat*_*usa 0

/dev/random基本上,如果(或/dev/urandom)没有足够的熵,那么RAND_bytes就会失败。没有简单的方法来确定调用何时会失败,但这种情况不太可能发生。