ºìÁªLinuxÃÅ»§
Linux°ïÖú

ʹÓÃ/dev/randomÉú³ÉËæ»úÊý

·¢²¼Ê±¼ä:2006-09-01 01:07:47À´Ô´:ºìÁª×÷Õß:Explore
¡¡¡¡ºÜ¶à¿âÀý³Ì²úÉúµÄ¡°Ëæ»ú¡±ÊýÊÇ×¼±¸ÓÃÓÚ·ÂÕæ¡¢ÓÎÏ·µÈµÈ£»ËüÃÇÔÚ±»ÓÃÓÚÃÜÔ¿Éú³ÉÒ»ÀàµÄ°²È«º¯ÊýʱÊDz»¹»Ëæ»úµÄ¡£ÆäÎÊÌâÔÚÓÚÕâЩ¿âÀý³ÌʹÓõÄËã·¨µÄδÀ´Öµ¿ÉÒÔ±»¹¥»÷ÕßÇáÒ×µØÍƵ¼³öÀ´£¨ËäÈ»¿´ÆðÀ´ËüÃÇ¿ÉÄÜÊÇËæ»úµÄ£©¡£¶ÔÓÚ°²È«º¯Êý£¬ÐèÒªµÄËæ»úÖµÓ¦¸ÃÊÇ»ùÓÚÁ¿×ÓЧӦ֮ÀàµÄȷʵÎÞ·¨Ô¤²âµÄÖµ¡£LinuxÄںˣ¨1.3.30ÒÔÉÏ£©°üÀ¨ÁËÒ»¸öËæ»úÊý·¢ÉúÆ÷/dev/random£¬¶ÔÓںܶలȫĿµÄÊÇ×ã¹»µÄ¡£

¡¡¡¡/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¢Ã»Óйرգ¬ÇëÄú¸ù¾Ý×Ô¼ºÐèÇóÔÚºÏÊʵĵط½¹Ø±Õ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ