2014-09-01 87 views
1

我目前正在與Coverity的玩弄它大叫約蘭特()調用蘭特(),srand()函數使用urandom的

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. 

1to1更換是否有使用urandom來返回在號碼更換容易降和rand()一樣的範圍?

+0

我想答案取決於rand()在你的系統上返回的範圍。你會比我們更瞭解......(如果你想告訴我們,這是RAND_MAX)。 – indiv 2014-09-01 22:14:34

+0

您是否在安全相關的應用程序中使用它,如果rand函數(不一定是線性同餘算法,但幾乎肯定不是密碼安全的)很容易被破壞? – 2014-09-01 23:15:51

+7

在您購買符合您要求的實施之前,您需要確定您的要求。 – 2014-09-01 23:32:53

回答

0

可能會嘗試這樣的事情: 我已經使用過很多次了,似乎工作得很好。

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); 
} 

編輯:如果你想擺脫調用隨機()這個link提供了一個實現隨機()的行爲與隨機的()。

+0

thx這看起來不錯 - 但它仍然最終使用隨機()和覆蓋的警告不會消失 - 任何其他的想法? - 或者可能是一種抑制警告的方法 – 2014-09-05 08:27:27

+0

注意:'int divisor = RAND_MAX /(limit + 1);'當limit == INT_MAX'或'limit> RAND_MAX'時出現問題。 – chux 2014-09-05 16:46:42

1

爲了抑制在我的代碼,在其使用不是rand()的Coverity的警告安全相關的,我提供了一個modeling.c Coverity公司modeling file到Coverity公司,告訴Coverity公司忽略的功能,例如

/* libc functions. */ 

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

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

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

對於沿着這些線路鎮壓的其他例子,我經常看Python的Coverity文檔。

希望這有助於!