LINUX隨筆一 隨機數生成的一些總結

linux隨機數產生的方式有不少,對$RANDOM、openssl rand -base64 、/dev/urandom和uuidgen比較熟悉一些,部分複製,僅供欣賞linux

(1)經過內部系統變量($RANDOM)git

echo $RANDOM安全

生成0-32767之間的整數隨機數,若超過5位能夠加個固定10位整數,而後進行求餘。dom

產生0到9的隨機數可使用$(($RANDOM%10))取餘數,理論上只要a<32767,就能夠取0到(a-1)之間的隨機數ide

或者echo ${RANDOM:0:1}下標從0開始長度爲1的個位數  #生成兩位數就是echo ${RANDOM:0:2}函數

6-87範圍的數:$(($RANDOM%82+6))    #($RANDOM%82能夠產生0到81之間的數)ui


(2)使用awk的隨機函數編碼


 awk 'BEGIN{srand();print rand()*1000000}'    #能夠加上if判斷spa


(3)openssl rand產生隨機數orm


openssl rand 用於產生指定長度個bytes的隨機字符。-base64或-hex對隨機字符串進行base64編碼或用hex格式顯示。

openssl rand -base64 n  #當n=1到3時,輸出四位隨機數,當n=4到6時輸出8位隨機數(隨機數包括數字、字母和特殊字符)

這裏須要解釋兩個名詞:

md5sum將讀取文件內容生成字母加數字數據

cksum將讀取文件內容生成數字數據

使用cut -c 1-8能夠截取8位隨機數,也但是使用head -c 8


openssl rand -base64 9 | md5sum | cut -c 1-8    #八位字母和數字的組合

openssl rand -base64 9 | cksum | cut -c 1-8       #八位數字


(4)經過時間得到隨機數(date)


%s  自UTC 時間 1970-01-01 00:00:00 以來所通過的秒數
%N  納秒(000000000-999999999)  

date +%s%N | cut -c 6-13   #取八位數字

date +%s%N | md5sum | head -c 8   #八位字母和數字的組合


(5)經過系統內惟一數據生成隨機數(/dev/random及/dev/urandom)


/dev/random存儲系統當前運行的環境的實時數據,能夠看做系統某時候的惟一值數據,提供優質隨機數。

產生的隨機數效果好,可是不能產生隨機數時,他會堵塞在那裏

/dev/urandom是非阻塞的隨機數產生器,讀取時不會產生阻塞,速度更快、安全性較差的隨機數發生器。

產生的隨機數效果通常,可是產生速度快,不會堵塞程序的運行,通常使用/dev/urandom


cat /dev/urandom | head -n 10 | md5sum | head -c 10     

cat /dev/urandom | strings -n 8 | head -n 1      #生成全字符的隨機字符串

cat /dev/urandom | sed -e 's/[^a-zA-Z0-9]//g' | strings -n 8 | head -n 1   #生成數字加字母的隨機字符串


其中 strings -n設置字符串的字符數,head -n設置輸出的行數。


head-200/dev/urandom| cksum |cut-d" " -f1   #urandom的數據不少使用cat會比較慢,在此使用head讀200行,cksum將讀取文件內容生成惟一的表示整型數據,cut以」 「分割而後獲得分割的第一個字段數據


(6)讀取linux的uuid碼


       UUID碼全稱是通用惟一識別碼 (Universally Unique Identifier, UUID),UUID格式是:包含32個16進制數字,以「-」鏈接號分爲五段,形式爲8-4-4-4-12的32個字符。linux的uuid碼也是有內核提供的,在/proc/sys/kernel/random/uuid這個文件內。cat/proc/sys/kernel/random/uuid每次獲取到的數據都會不一樣。


       cat /proc/sys/kernel/random/uuid| cksum | cut -f1 -d" "    #獲取不一樣的隨機整數

       cat /proc/sys/kernel/random/uuid| md5sum | cut -c1-8    #數字加字母的隨機數


linux可使用uuidgen得到一個UUID

#uuidgen

#39606037-3322-44ad-8f5f-a815fcdb483e

uuidgen支持兩個參數,-r生成隨機uuid,-t生成基於時間的uuid。

#uuidgen | md5sum | head -c 8    #隨機生成八位字母加數字組合的隨機數

#uuidgen生成的隨機數只有字母數字加-

#uuidgen | tr [0-9-] [a-z] | head -c 8     #取八位小寫字母

或者uuidgen | sed 's/[^a-z]//g' | head  -c 8     #sed 's/[^a-z]//g'將內容中不是[a-z]的去除


(7)從元素池中隨機抽取取


pool=(a b c d e f g h i j k l m n o p q r s t 1 2 3 4 5 6 7 8 9 10)


num=${#pool[*]}


result=${pool[$((RANDOM%num))]}


用於生成一段特定長度的有數字和字母組成的字符串,字符串中元素來自自定義的池子。


(8)使用expect附帶的mkpasswd生成隨機數


mkpasswd命令依賴於數據包expect,所以必須經過"yum install expect -y"命令先安裝該數據包。示例:[root@test ~]# mkpasswd -l 9 -d 2 -c 3 -s 1VxqE}t56o[root@test ~]# mkpasswd -l 9 -d 2 -c 3 -s 1W99syAyf;[root@test ~]# mkpasswd -l 9 -d 2 -c 3 -s 1snll4LX6<相關參數說明以下:    -l #      (length of password, default = 9)    #指定密碼長度;    -d #      (min # of digits, default = 2)    #指定密碼中數字的數量;    -c #      (min # of lowercase chars, default = 2)        #指定密碼中小寫字母的數量;    -C #      (min # of uppercase chars, default = 2)    #指定密碼中大寫字母的數量;    -s #      (min # of special chars, default = 1)    #指定密碼中特殊字符的數量;    -p prog   (program to set password, default = /bin/passwd)    #程序設置密碼,默認是passwd;      # mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1|md5sum|cut -c 2-10  #8bbff4c99

相關文章
相關標籤/搜索