使用 dev random生成隨機數

2021-06-22 17:14:48 字數 2369 閱讀 6197

很多庫例程產生的「隨機」數是準備用於**、遊戲等等;它們在被用於金鑰生成一類的安全函式時是不夠隨機的。其問題在於這些庫例程使用的演算法的未來值可以被攻擊者輕易地推導出來(雖然看起來它們可能是隨機的)。對於安全函式,需要的隨機值應該是基於量子效應之類的確實無法**的值。linux核心(1.3.30以上)包括了乙個隨機數發生器/dev/random,對於很多安全目的是足夠的。 

/dev/random 是如何建立隨機數的呢? 

linux 作業系統提供本質上隨機(或者至少具有強烈隨機性的部件)的庫資料。這些資料通常來自於裝置驅動程式。例如,鍵盤驅動程式收集兩個按鍵之間時間的資訊,然後將這個環境雜訊填入隨機數發生器庫。 

隨機資料儲存在 熵池中,它在每次有新資料進入時進行「攪拌」。這種攪拌實際上是一種數學轉換,幫助提高隨機性。當資料新增到熵池中後,系統估計獲得了多少真正隨機位。 

測定隨機性的總量是很重要的。問題是某些量往往比起先考慮時看上去的隨機性小。例如,新增表示自從上次按鍵盤以來秒數的 32 位數實際上並沒有提供新的 32 位隨機資訊,因為大多數按鍵都是很接近的。

從 /dev/random 中讀取位元組後,熵池就使用 md5 演算法進行密碼雜湊,該雜湊中的各個位元組被轉換成數字,然後返回。 

如果在熵池中沒有可用的隨機性位, /dev/random 在池中有足夠的隨機性之前等待,不返回結果。這意味著如果使用 /dev/random 來產生許多隨機數,就會發現它太慢了,不夠實用。我們經常看到 /dev/random 生成幾十位元組的資料,然後在許多秒內都不產生結果。 

幸運的是有熵池的另乙個介面可以繞過這個限制:/dev/urandom。即使熵池中沒有隨機性可用,這個替代裝置也總是返回隨機數。如果您取出許多數而不給熵池足夠的時間重新充滿,就再也不能獲得各種**的合用熵的好處了;但您仍可以從熵池的 md5 雜湊中獲得非常好的隨機數!這種方式的問題是,如果有任何人破解了 md5 演算法,並通過檢視輸出了解到有關雜湊輸入的資訊,那麼您的數就會立刻變得完全可預料。大多數專家都認為這種分析從計算角度來講是不可行的。然而,仍然認為 /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

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

53 nbytes -= i;

54 cp += i;

55 lose_counter = 0;

56 }

57 }

58

59 for (i = 0; i < nbytes; i++)

60

66 *cp++ = rand_r(&seed) & 0xff;

67 }

68

69 return;

70 }

13行:  定義fd為靜態變數,這樣只開啟一次裝置。

17 – 19行: 無阻塞模式開啟/dev/random裝置。如果該裝置開啟失敗嘗試開啟/dev/urandom。

29行:  void get_random_bytes(void* buf, int nbytes)函式是提供給使用者的介面,使用者呼叫這個函式就可以得到隨機數。

37-57行: read有可能返回的位元組數小於請求的位元組數。這時候就迴圈讀直到讀夠了所請求的大小。這樣最多重複8次。然後返回。

59-67行: 如果上面重複8次都沒有讀夠所請求的位元組數,則我們自己生成隨機數來填充。

注意:開啟的fd我們並沒有關閉,請您根據自己需求在合適的地方關閉。

使用prim演算法生成隨機迷宮

三 prim演算法和迷宮生成 1.我們將迷宮定義如下 迷宮由道路和牆組成,且迷宮中道路上的任意兩點應互相可達 2.隨機迷宮生成演算法一般有以下三種,這裡只介紹隨機prim演算法 最小生成樹 在帶權圖g v,e 中 v為點集,e為邊集且每條邊帶有權值 我們希望找到e的乙個無環子集t,使得v中任意兩點可...

使用shell生成隨機數

1 bin bash 2for i in seq 1 1 3 do4for j in seq 1 2 5 do6 s random 100 7 echo e i,j t s m 1 2 8done 9done 第1行 bin bash是指此指令碼使用 bin bash來解釋執行。其中,是乙個特殊的表...

隨機生成隨機數

現畫乙個command命令按鈕,進行貼上。private sub command1 click show me scale 0,0 18,8 me.auto redraw true me.draw mode 2 circle 3,4 3,vb red me.auto redraw false lin...