這裡介紹如何在 Linux 中產生亂數的密碼,讓你的密碼更安全,不容易被破解。

對於 Linux 管理者而言,很多情況下都會需要使用到亂數的密碼,例如新增 Linux 系統的使用者帳號時,你會需要為每一個新的帳號設定一組預設的密碼,在安全性的考量上,這個預設密碼也不能太簡單,最好的方式就是使用亂數產生的密碼,確保每個帳號在使用者拿到帳號資訊之前,不會被駭。

另外系統上的一般使用者忘記密碼也是時常會發生的事,而管理者在這種時候就會需要為使用者重設密碼,這時候也會需要亂數的密碼,以確保系統與帳號的安全。

以下我們介紹幾個 Linux 中可以用來產生亂數密碼的指令,以及一些使用範例。

pwgen 指令

pwgen 是一個可以產生亂數密碼的小工具,在 Ubuntu/Debian Linux 中可以用 apt 安裝:

sudo apt-get install pwgen

安裝完成後,執行它就會產生亂數的密碼:

pwgen

預設會產生 160 組長度為 8 的亂數密碼:

eoLe3Aht EeCh5ooj phooVai5 queY3Euw Aichoo5e Al7mae1o aeLooj7o ahweC5ie
ohX3IK8a eiH7Wohg veiS0Iu3 Aiv7ilee if3Eetee thae3Boo haeTh9ao ahD8uiG7
oxoo9oV3 Oozei6wi phoo7ouM Wiel0ohb Tae6ar0o Da6quie3 eeKoh2Ee eo4Ohc5U
ivie0Uc8 BohPhah4 rohtieM9 ko0aiZe2 jaeC4dai ej6Quiel ailoh2Ne oa8ooQuo
es9Aitai aiKae1Hu Mohko9su aim6eoDo ieJu0Phe aezeiD6p Ub9ilai4 eiru3Eth
neiY9eCh au7cei5W Wae4yohr Aengad5e Phahgh5v cohY8ies tav9Och3 UithaGh8
ChahieY4 aeC6umei Loh4cai1 hieY0wai oQu9choo eiph6Too eer6uaGh Fi1auhai
Viek9zea Ipoosh2U aexee2Oo aishohP6 ohpee5Xo leih2Kai eisie7Th Eic1uu2g
thub1Aeg faeK8boo choo4iPu ahciKu6b hooxoa7X eecheiZ4 ahkoS3ch saoPae4t
haiVo9oo ohL9iof0 FoV9YiPe eaY8nies di0aoc7I phoe2OBa Ei6aiyai akai1eeW
Moh0ge4n Ep9iefu8 eVu8uvoh Wavah0Wo Hah7ueki Pho0oobu Ohgo7doh penie6iH
sha0Eemu phohV6om eelueK3f OhCaesh8 ub3Leim4 Ahm7chee eeTi5aix Thijai2m
Shai8moh eebae5Hi ANgi8aiZ vaih8iiK oKooW4Nu Ahchae3e Cei0uFee Quu9aej0
Eishe4za xi9niB2i Hee8laeG aebee3Ji Aech7tho en1ohZia Ua2eweo6 saL3eeg9
caeDung3 Eiyoth8x Boas9Doo su5Ahjoh ooW2qua1 ge1pup2A kaiJaes8 Yoh2mi6o
Gee1eihu Ie1aimis oomah1AP Bes6AiDo eizeir2I Ein4eiPh aiYu1osh ni0Fohh0
Eimiema9 rooghi0E eeThoh8e egeoYoe0 ziegieJ3 Ohzan7ji aich9Yei ief3aiKe
theiy5aT Gohwoo9i ekegh2Ph oashieC5 AhBahsh1 XohB5ci4 quaJohH5 Hahbah4l
xua0so5X ooG1Za5a Hi1aecho Eidu8tho ooph7Sha tahtie4A pie5Ohph oeDie0io
Ahkefae4 Lot6eer9 Deeghi0o Lei0waiw foo8aeNo zahB9xai lee4oPho loo4Shu9

pwgen 預設產生那麼多的密碼是有原因的,這樣的設計可以讓使用者在其中選擇一組來使用,就算旁邊有其他人偷看到,也很難知道真正的密碼是哪一組,當使用者記好密碼之後,隨即將螢幕上有含有這些密碼的終端機關閉,這樣就可以避免密碼外洩的問題。

您也可以直接指定要產生的密碼長度與個數,例如產生 6 組長度為 30 的密碼:

pwgen 30 6

輸出為

aebazae4quaah8Iikogh0Doh7Shief oaleZohj2Aefeimues5moeHeiLeePo
uothoTiereek1Feeh4Ithuacha8hee aememifeejuW9joo2Ohwoo5eijier8
fohch2oofoodu9kooceeS9ahsh6oaC eeDaiqu4fiotaiPi8jax7ahRe4ahm0

pwgen 如果是用在 shell 指令稿中的話,它預設的情況就會改為一次只輸出一筆密碼,這樣可以方便程式的撰寫:

#!/bin/sh
PASSWORD=`pwgen`
echo "The password is" $PASSWORD

這個指令稿執行起來的輸出會像這樣:

The password is engeweon

在預設的情況下,pwgen 會產生讓人比較好記的密碼,並不是完全用亂數產生的,如果您想要產生真的非常安全的亂數密碼,可以加上 -s 參數,而這樣的密碼對一般人而言就比較難記的起來,適合用於程式中,或是用紙筆記下來。

pwgen -s

另外 -y 參數可以在密碼中加入一些特殊字元,讓密碼更安全,:

pwgen -y

輸出為

Ei_phei7 eiF;ai3a oCho'o2U Oa'tee2J pi(pah4K roh-Ng3e yae9Im/e Vi9roo/y
ua*Mae3J IS:ah3ei aiP4tie` Boo,r5ai bi9eK`a6 zeeX'oo9 Gae;s9Co poo"b1Tu
Vooy<ae7 iP(a3tie OhS7ood] Xu)ch8bo pho;Th5o Ia1phoh~ aiH]a0ae Pie_sh0r
ith4aS(e vai'B9ee an9ohM?o AhSh(eo8 ua{Roof5 Nei2pit{ do:Z5ree oV*aeg7h
It&i0hoo euZ:ai2e aa>h0Au0 ej\i8Phi Iequ1zi' ga2Aph-e di7ad$uT gooP9uu(
fo6aiP.i Kai+pub3 ooW5oox& aeV+ie3o Uch_oh8j aiw2Ea(v Uwou:jo8 Pe"u*l8e
Goh]l8Ai ze\e2Voo Ro8chah( po6Phie? Ohd_ai4h oowe:eN3 ee2yu^Yo Kee,Gh0i
uy5Ook|u Au4ohb.o oc"ohGh6 Au^Sh7mo Eimu<e1o Fah2Ni`b Mi*joh4z ahNu?i0D
Bae&j3Ze ohY_u2wu ui[h0ieM ohF5wi?b ai=Ra2eF foo!Pu8a EiS0li(a ooqu<e1Y
ahPh@oo7 AhKoo-B9 ooL+a7ph Koo8pho\ Aic4aaz; Thai<pa1 aeM$ae1b eiTh]e6o
Noh>th1e nuG[i8th Cho9sei- quoh+n9L iex6Koh* eM9jah:v gu5uT(ai ahoo=Sh1
we^B7Ais Ga+ish4w xoo9Loo) zae<v4Ro Xae6La~Z zei<Gh8N aem+aiY1 boe4seV>
gu=L0xo4 Am5loow' thei9uF_ Fieg@ei3 ieQu;ox9 Eena[D2i iph&aSo4 eu/T9ek$
Phie=gh0 Wi!qu7oh za~u@Ng8 ooC3poo] Oosh[i2n fien`e4Y eo]sh9Du Ohw@ah9x
ei\K3ahZ eeyee?R8 Fe"Wee7e poo7Ooh| Ohf{ei4h Mai6roh% quure*Z5 mie+J8to
koh?T0az Ieph'i2o fie*X1no shai:T1e xoo*Ph1o Ae/Soh4e feM|o4vo onu1Aj{i
Eik6Ica! woh7Ii/P kae;D4ev en/uh1Ah ae0Zaet[ we)Koh0u wi^u0aiF Ha*k|ah6
uu(de6Jo Rae<G2ph ahR_oo5H ru%e7uL< tooB[ee0 eiBah}w0 ai4AWah\ Ahng(ee4
co#ux6Ui Koo2aiP^ eiwi?n9N ya(e;C4z uo6ohL\i Od4bod>i chooH,e8 Os7paeh"
Ai8chuh) chae_S0e Yoh%l1Ph nei<Gah4 Ook5ei~W ohp)iw0H deT6Oop/ Ees^aef5

不過這樣的話,當然密碼也就更難記了。

以下是 pwgen 其他的一些常用參數:

  • -0:讓產生的密碼不要包含數字。
  • -1:輸出時,一行顯示一個密碼。
  • -A:讓產生的密碼不要包含大寫英文字。
  • -B:讓產生的密碼不要包含容易混淆的字元,例如 l1,或是 0O
  • -c:讓產生的密碼中至少包含一個大寫英文字,這是預設的選項。
  • -n:讓產生的密碼中至少包含一個數字,這是預設的選項。

您可以任意結合這些參數來調整密碼的結構,例如想要單純以小寫的英文字母來產生密碼,就可以執行:

pwgen -0A

makepasswd 指令

makepasswdpwgen 類似,都可以用來直接產生各種長度的亂數密碼,使用前先安裝:

apt-get install makepasswd

直接執行會產生一組亂數密碼:

makepasswd

輸出為

EzNiYbfS

產生長度為 50 的亂數密碼:

makepasswd --char 50

輸出為

2Mx83b18wgJsjTTGd9QGTTtsa32Gc3cJzLD8EKfBu4dmR5VI0Y

一次產生 6 組長度為 20 的亂數密碼:

makepasswd --char 20 --count 6

輸出為

AdQFeV15YbBry3nQh0NC
hvJ1ErVTfDVTxRFhHApU
JuGr7N3pA3HieJ1fNDDF
4AUod2zqoSmcVVSYNf2B
qtHAjio3GT1TDtWw7hDa
u67md8FeTWmjccKY8JAf

使用 Perl 產生亂數密碼

自己用 Perl 寫一個產生密碼的指令稿其實也很簡單,以下是一個範例程式:

#!/usr/bin/perl
print generatePassword(10) . "\n";
exit;
sub generatePassword {
  $length = shift;
  $possible = 'abcdefghijkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
  while (length($password) &lt; $length) {
    $password .= substr($possible, (int(rand(length($possible)))), 1);
  }
  return $password;
}

這個 Perl 程式會以亂數的方式從 $possible 中選取字元組成密碼,執行之後所產生的輸出會像這樣:

9CBGAyzYt7

如果要增加密碼的複雜度,可以自己在 $possible 中加入特殊字元。

Shell 指令稿

除了使用現成的指令或是程式產生密碼之外,也可以利用 Linux 中的 shell 與一些小工具來產生密碼,這種作法就會有非常多的變化與彈性,以下是一些範例。

使用 SHA 計算時間的雜湊碼(hash),經過 base64 編碼之後,取前 32 個字元:

date +%s | sha256sum | base64 | head -c 32 ; echo

輸出為

NjY3ODU4YzA5MzJkOTk1ZjQyNjBhYjhk

讀取 /dev/urandom 的隨機內容,取出可以作為密碼的字元,然後拿前面 32 個產生一組密碼:

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32}; echo

輸出為

mNJrtsKNXhFiReGApwnJOx58XAaLqRVv

使用 opensslrand 功能產生亂數密碼:

openssl rand -base64 32

輸出為

zoHCcHtmngCSfcfzQrd+HRNEyQwTF7xdXAZ+yJA7Av4=

這個跟上面 /dev/urandom 的例子類似,不過用不同的處理方式:

tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1

輸出為

46kSNVvQCeRNsAAXr5H5FZK1Ci5eX9

另外一個讀取 /dev/urandom 例子:

strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo

輸出為

0RiqDmFuHXmkcCNPDjL7qxc0q9WmLs

使用 dd 讀取 /dev/urandom 例子:

dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev

輸出為

3lvoy9+LB0mIAOjk1TDrE1dT7QSjbL+fHTxsft92zEI

產生只需要用左手即可輸入的密碼:

< /dev/urandom tr -dc '12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB' | head -c8; echo ""

輸出為

fsTDqZz2

如果要時常使用這這類的指令,可以將其寫成 shell 的函數,放進 ~/.bashrc 中,讓使用更方便:

randpw(){ < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-16};echo;}

之後即可直接執行這個函數:

randpw

輸出為

aV7CbdjUDeRIW3yg

最後介紹一個最簡單的亂數密碼產生方式,除了 Linux 之外,Mac OS X 或是 Cygwin 也都可以直接使用:

date | md5sum

輸出為

f2ede6e6c79a400ea82384a182d84be2 --

當然有人會認為這樣產生密碼的方式不夠隨機,不過對於一般人應該是足夠了。

參考資料