如何在Linux終端生成隨機(jī)字符
一、隨機(jī)數(shù)生成器
要在Linux/Unix發(fā)行版中生成隨機(jī)數(shù)據(jù),有種選擇:/dev/random
或者/dev/urandom
。
這些設(shè)備是存儲(chǔ)隨機(jī)生成的數(shù)據(jù)的特殊文件。如果用ls -l
查看文件屬性則顯示為字符型設(shè)備文件。它們可以像普通文件一樣讀取,并且讀取的數(shù)據(jù)是通過系統(tǒng)中提供隨機(jī)性的多個(gè)熵源生成的。
/dev/random
會(huì)從設(shè)備驅(qū)動(dòng)收集環(huán)境噪音到一個(gè)熵池,比如CPU、硬盤、鼠標(biāo)等,隨機(jī)數(shù)就從該熵池中獲取。當(dāng)熵池中的數(shù)據(jù)用完之后,就會(huì)處于阻塞狀態(tài),,直到收集到額外的環(huán)境噪音。/dev/random
是一個(gè)傳統(tǒng)的接口,現(xiàn)在在大部分場(chǎng)合下已經(jīng)被/dev/urandom
替代。
/dev/urandom
同樣是從熵池中請(qǐng)求隨機(jī)數(shù)。但是如果請(qǐng)求的隨機(jī)數(shù)據(jù)比較龐大,在熵池中數(shù)據(jù)耗盡后會(huì)使用SHA
、MD5
或者其它算法來產(chǎn)生數(shù)據(jù)。也就意味著/dev/urandom
并不會(huì)阻塞,并且生成的隨機(jī)數(shù)并不一定真的隨機(jī)。相對(duì)來說,/dev/random
生成的隨機(jī)數(shù)隨機(jī)程度更高。
通過以下命令可以查看系統(tǒng)中熵池的大小,單位為二進(jìn)制位數(shù)。
cat /proc/sys/kernel/random/poolsize
二、random 和 urandom 的區(qū)別
1. 區(qū)別
項(xiàng)目randomurandom小數(shù)據(jù)隨機(jī)程度非常高非常高大數(shù)據(jù)隨機(jī)程度可能因?yàn)殪爻睾谋M而阻塞,
直到收集到新的環(huán)境噪音。比較高是否會(huì)阻塞是否響應(yīng)速度慢快
2. 應(yīng)用場(chǎng)景
根據(jù)不同的特點(diǎn)可以在不同的場(chǎng)景使用。
/dev/urandom
應(yīng)用場(chǎng)景:
生成一個(gè)隨機(jī)數(shù)據(jù)構(gòu)成的文件用于測(cè)試。
使用
dd
命令把隨機(jī)數(shù)據(jù)寫入硬盤以達(dá)到擦除硬盤的效果。
/dev/random
應(yīng)用場(chǎng)景:
一次性密碼、生成密鑰。
三、應(yīng)用
1. 生成密碼
生成10位純數(shù)字的密碼
tr -dc '0-9' < /dev/random | head -c 10
生成10位包含大小寫字母和數(shù)字的密碼
tr -dc 'a-zA-Z0-9' < /dev/random | head -c 10
或
tr -dc [:alnum:] < /dev/random | head -c 10
2. 生成文件
生成
BASE64
編碼的隨機(jī)文件base64 < /dev/random | head -c 1000 > test.txt
生成1G大小的包含隨機(jī)數(shù)據(jù)的文件
head -c 1G /dev/urandom > myfile
或
dd bs=1G count=1 dd if=/dev/random of=myfile
3. 覆蓋存儲(chǔ)設(shè)備數(shù)據(jù)
使用
/dev/urandom
進(jìn)行覆蓋將
sdX
替換為要覆蓋的存儲(chǔ)設(shè)備。dd if=/dev/urandom of=/dev/sdX
使用
/dev/zero
進(jìn)行覆蓋將
sdX
替換為要覆蓋的存儲(chǔ)設(shè)備。dd if=/dev/zero of=/dev/sdX