使用 Perl 產生亂數密碼

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

#!/usr/bin/perl
print generatePassword(10) . "\n";
exit;
sub generatePassword {
  $length = shift;
  $possible = 'abcdefghijkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
  while (length($password) < $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 --
當然有人會認為這樣產生密碼的方式不夠隨機,不過對於一般人應該是足夠了。

參考資料:TecmintAbout TechHTG