¡¡¡¡/dev/random ÊÇÈçºÎ´´½¨Ëæ»úÊýµÄÄØ£¿
¡¡¡¡Linux ²Ù×÷ϵͳÌṩ±¾ÖÊÉÏËæ»ú£¨»òÕßÖÁÉÙ¾ßÓÐÇ¿ÁÒËæ»úÐԵIJ¿¼þ£©µÄ¿âÊý¾Ý¡£ÕâЩÊý¾Ýͨ³£À´×ÔÓÚÉ豸Çý¶¯³ÌÐò¡£ÀýÈ磬¼üÅÌÇý¶¯³ÌÐòÊÕ¼¯Á½¸ö°´¼üÖ®¼äʱ¼äµÄÐÅÏ¢£¬È»ºó½«Õâ¸ö»·¾³ÔëÉùÌîÈëËæ»úÊý·¢ÉúÆ÷¿â¡£
¡¡¡¡Ëæ»úÊý¾Ý´æ´¢ÔÚ ìسØÖУ¬ËüÔÚÿ´ÎÓÐÐÂÊý¾Ý½øÈëʱ½øÐС°½Á°è¡±¡£ÕâÖÖ½Á°èʵ¼ÊÉÏÊÇÒ»ÖÖÊýѧת»»£¬°ïÖúÌá¸ßËæ»úÐÔ¡£µ±Êý¾ÝÌí¼Óµ½ìسØÖкó£¬ÏµÍ³¹À¼Æ»ñµÃÁ˶àÉÙÕæÕýËæ»úλ¡£
¡¡¡¡²â¶¨Ëæ»úÐÔµÄ×ÜÁ¿ÊǺÜÖØÒªµÄ¡£ÎÊÌâÊÇijЩÁ¿ÍùÍù±ÈÆðÏÈ¿¼ÂÇʱ¿´ÉÏÈ¥µÄËæ»úÐÔС¡£ÀýÈ磬Ìí¼Ó±íʾ×Ô´ÓÉϴΰ´¼üÅÌÒÔÀ´ÃëÊýµÄ 32 λÊýʵ¼ÊÉϲ¢Ã»ÓÐÌṩÐ嵀 32 λËæ»úÐÅÏ¢£¬ÒòΪ´ó¶àÊý°´¼ü¶¼ÊǺܽӽüµÄ¡£
¡¡¡¡´Ó /dev/random ÖжÁÈ¡×Ö½Úºó£¬ìسؾÍʹÓà MD5 Ëã·¨½øÐÐÃÜÂëÉ¢ÁУ¬¸ÃÉ¢ÁÐÖеĸ÷¸ö×Ö½Ú±»×ª»»³ÉÊý×Ö£¬È»ºó·µ»Ø¡£
¡¡¡¡Èç¹ûÔÚìسØÖÐûÓпÉÓõÄËæ»úÐÔ룬 /dev/random ÔÚ³ØÖÐÓÐ×ã¹»µÄËæ»úÐÔ֮ǰµÈ´ý£¬²»·µ»Ø½á¹û¡£ÕâÒâζ×ÅÈç¹ûʹÓà /dev/random À´²úÉúÐí¶àËæ»úÊý£¬¾Í»á·¢ÏÖËüÌ«ÂýÁË£¬²»¹»ÊµÓá£ÎÒÃǾ³£¿´µ½ /dev/random Éú³É¼¸Ê®×Ö½ÚµÄÊý¾Ý£¬È»ºóÔÚÐí¶àÃëÄÚ¶¼²»²úÉú½á¹û¡£
¡¡¡¡ÐÒÔ˵ÄÊÇÓÐìسصÄÁíÒ»¸ö½Ó¿Ú¿ÉÒÔÈƹýÕâ¸öÏÞÖÆ£º/dev/urandom¡£¼´Ê¹ìسØÖÐûÓÐËæ»úÐÔ¿ÉÓã¬Õâ¸öÌæ´úÉ豸Ҳ×ÜÊÇ·µ»ØËæ»úÊý¡£Èç¹ûÄúÈ¡³öÐí¶àÊý¶ø²»¸øìسØ×ã¹»µÄʱ¼äÖØгäÂú£¬¾ÍÔÙÒ²²»ÄÜ»ñµÃ¸÷ÖÖÀ´Ô´µÄºÏÓÃìصĺô¦ÁË£»µ«ÄúÈÔ¿ÉÒÔ´ÓìØ³ØµÄ MD5 É¢ÁÐÖлñµÃ·Ç³£ºÃµÄËæ»úÊý£¡ÕâÖÖ·½Ê½µÄÎÊÌâÊÇ£¬Èç¹ûÓÐÈκÎÈËÆƽâÁË MD5 Ëã·¨£¬²¢Í¨¹ý²é¿´Êä³öÁ˽⵽ÓйØÉ¢ÁÐÊäÈëµÄÐÅÏ¢£¬ÄÇôÄúµÄÊý¾Í»áÁ¢¿Ì±äµÃÍêÈ«¿ÉÔ¤ÁÏ¡£´ó¶àÊýר¼Ò¶¼ÈÏΪÕâÖÖ·ÖÎö´Ó¼ÆËã½Ç¶ÈÀ´½²ÊDz»¿ÉÐеġ£È»¶ø£¬ÈÔÈ»ÈÏΪ /dev/urandom ±È /dev/random Òª¡°²»°²È«Ò»Ð©¡±£¨²¢Í¨³£ÖµµÃ»³ÒÉ£©¡£
¡¡¡¡Ó¦ÓÃÖгöÏÖµÄÎÊÌ⣺
ÔÚÎÒÃǵķþÎñÆ÷³ÌÐòÖУ¬Óû§µÇ½µÄʱºò»á¶ÁÈ¡/dev/random²úÉúËæ»úÊý£¬ÎÊÌâÀ´ÁË£¬µ±Óû§µÇ½±È½ÏÃܼ¯£¬Õâʱºòread¾Í»á·µ»ØÌرðÂý£¬²¢ÇÒ·µ»ØµÄ×Ö½ÚÊýÒ²±ÈÒªÇóµÄÉÙ£¬ÉõÖÁ²»·µ»Ø¡ª¡ª×èÈû¡£ÎÒÃÇ°ÑÓû§µÇ½´¦Àíº¯Êý·ÅÔÚÁËÏ̳߳ØÀµ¼ÖµÄÎÊÌâ¾ÍÊÇÏ̳߳ØÀïËùÓÐÏ̶߳¼¿ÉÄÜ»á×èÈû£¬Õâ¾ÍÔì³ÉÁ˾ܾø·þÎñ¹¥»÷¡£µ¼ÖÂÆäËûÓû§µÇ½ʧ°Ü¡£
¡¡¡¡½â¾ö·½°¸£º
[code] 1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10
11 static int get_random_fd (void)
12 {
13 static int fd = -2;
14
15 if (fd == -2)
16 {
17 fd = open ("/dev/random", O_RDONLY | O_NONBLOCK);
18 if (fd == -1)
19 fd = open ("/dev/urandom", O_RDONLY | O_NONBLOCK);
20 }
21
22 return fd;
23 }
24
25 /*
26 * Generate a series of random bytes. Use /dev/random if possible,
27 * and if not, use /dev/urandom.
28 */
29 void get_random_bytes(void* buf, int nbytes)
30 {
31 int i, fd = get_random_fd();
32 int lose_counter = 0;
33 char *cp = (char*)buf;
34 struct timeval tv;
35 static unsigned seed = 0;
36
37 if (fd >= 0)
38 {
39 while (nbytes > 0)
40 {
41 i = read (fd, cp, nbytes);
42 if ((i < 0) &&
43 ((errno == EINTR) || (errno == EAGAIN)))
44 continue;
45
46 if (i <= 0)
47 {
48 if (lose_counter++ == 8)
49 break;
50
51 continue;
52 }
53 nbytes -= i;
54 cp += i;
55 lose_counter = 0;
56 }
57 }
58
59 for (i = 0; i < nbytes; i++)
60 {
61 if (seed == 0)
62 {
63 gettimeofday(&tv, 0);
64 seed = (getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec;
65 }
66 *cp++ = rand_r(&seed) & 0xFF;
67 }
68
69 return;
70 }[/code]
¡¡¡¡£±£³ÐУº¡¡¡¡¶¨ÒåfdΪ¾²Ì¬±äÁ¿£¬ÕâÑùÖ»´ò¿ªÒ»´ÎÉ豸¡£
¡¡¡¡17 - 19ÐУº¡¡ÎÞ×èÈûģʽ´ò¿ª/dev/randomÉ豸¡£Èç¹û¸ÃÉ豸´ò¿ªÊ§°Ü³¢ÊÔ´ò¿ª/dev/urandom¡£
¡¡¡¡£²£¹ÐУº¡¡¡¡void get_random_bytes(void* buf, int nbytes)º¯ÊýÊÇÌṩ¸øÓû§µÄ½Ó¿Ú£¬Óû§µ÷ÓÃÕâ¸öº¯Êý¾Í¿ÉÒԵõ½Ëæ»úÊý¡£
¡¡¡¡£³£·££µ£·ÐУº¡¡readÓпÉÄÜ·µ»ØµÄ×Ö½ÚÊýСÓÚÇëÇóµÄ×Ö½ÚÊý¡£Õâʱºò¾ÍÑ»·¶ÁÖ±µ½¶Á¹»ÁËËùÇëÇóµÄ´óС¡£ÕâÑù×î¶àÖظ´£¸´Î¡£È»ºó·µ»Ø¡£
¡¡¡¡£µ£¹££¶£·ÐУº¡¡Èç¹ûÉÏÃæÖظ´£¸´Î¶¼Ã»ÓжÁ¹»ËùÇëÇóµÄ×Ö½ÚÊý£¬ÔòÎÒÃÇ×Ô¼ºÉú³ÉËæ»úÊýÀ´Ìî³ä¡£
¡¡¡¡×¢Ò⣺´ò¿ªµÄfdÎÒÃDz¢Ã»Óйرգ¬ÇëÄú¸ù¾Ý×Ô¼ºÐèÇóÔÚºÏÊʵĵط½¹Ø±Õ¡£