【问题标题】:Rand(), srand() 1to1 replacement using urandomRand(), srand() 使用 urandom 进行 1to1 替换
【发布时间】:2014-10-26 02:37:55
【问题描述】:

我目前正在玩掩护,它对 rand() 调用大喊大叫

CID 52583 (#1 of 1): Don't call (DC.WEAK_CRYPTO)
dont_call: rand() should not be used for security related applications, as linear congruential algorithms are too easy to break.

使用 urandom 返回与 rand() 相同范围内的数字是否可以轻松替换?

【问题讨论】:

  • 我想答案取决于 rand() 在您的系统上返回的范围。你会比我们更清楚......(如果你想告诉我们,那就是 RAND_MAX)。
  • 您是否在安全相关的应用程序中使用它,如果rand 实现(不一定是线性同余算法,但几乎可以肯定不是密码安全)很容易被破解?
  • 在购买满足您要求的实施之前,您需要弄清楚您的要求是什么。
  • 请注意,创建名为 rand()srand() 的函数的插入式替换可能仍会被 Coverity 抱怨。您必须使用不同的名称来说服它您没有使用标准版本。
  • thx 伙计们——是的,实际上我需要一个函数来从给定范围内获取 rand 值——它不是应用程序的安全相关部分——它只是为了随机化计时信息。例如:我想要一个函数 my_random(0, MAX_RAND) - 并获得一个介于 0-MAX_RAND 范围内的值

标签: c linux random coverity


【解决方案1】:

为了在我的代码中抑制关于 rand() 的 Coverity 警告,因为它的使用与安全性相关,我向 Coverity 提供了一个 modeling.c Coverity modeling file,以告诉 Coverity 忽略该功能,例如

/* libc functions. */

int rand(void) {
  /* ignore */
}

long random(void) {
  /* ignore */
}

void srand(unsigned int seed) {
  /* ignore */
}

关于这些方面的其他抑制示例,我经常查看 Python 的 Coverity 文档。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    可能会尝试这样的事情: 我用过很多次,感觉效果很好。

    void SeedRandomNumGenerator()
    {
        unsigned int seed;
        int fd;
    
        fd = open("/dev/urandom", O_RDONLY);
        if( fd )
        {
            read(fd, &seed, sizeof(seed));
            close(fd);
            srandom( seed );
        }
    }
    
    /*
        return a proper random number that uses the uniform distribution
        of numbers returned by random() -- this is far better than
        simply doing random() % limit
        According to calculations, random() will at most be called twice
        and usually only once per call to random_lim()
    
        returns int between 0 and limit
        so if you want a random number between 1-10 inclusive the call would 
        look like this:     random_lim(9)+1
    */
    int random_lim(int limit)
    {
        int divisor = RAND_MAX/(limit+1);
        int retval;
    
        do
        { 
            retval = random() / divisor;
        }while (retval > limit);
    
        return( retval );
    }
    

    编辑:如果你想摆脱对 random() 的调用,这个link 提供了一个与 random() 行为相同的 random() 实现。

    【讨论】:

    • thx 这看起来不错 - 但它最终仍然使用 random() 并且覆盖的警告不会消失 - 还有其他想法吗? - 或者可能是一种抑制警告的方法
    • 注意:int divisor = RAND_MAX/(limit+1);limit == INT_MAXlimit > RAND_MAX 时的问题。
    猜你喜欢
    • 2020-12-12
    • 2014-05-01
    • 2021-01-23
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多