這裡介紹如何使用 Python 自己產生 Linux 中 /etc/shadow 所使用的加密格式密碼。

在 Linux 系統上,所有使用者的密碼都是以加密的形式存放在 /etc/shadow 檔案中,如果想要手動產生,可以使用以下所介紹的方法。

/etc/shadow 密碼格式

/etc/shadow 中的密碼是用以下格式所儲存的:

$ID$SALT$ENCRYPTED

ID 代表加密演算法,可能的值如下:

  • 1:MD5(雜湊長度為 22 個字元)。
  • 5:SHA-256(雜湊長度為 43 個字元)。
  • 6:SHA-512(雜湊長度為 86 個字元)。

SALT 是隨機字串(最長不超過 16 個字元),而 ENCRYPTED 則是密碼的雜湊值(hash)。

MD5 密碼雜湊

以下是產生 MD5 密碼雜湊的 Python 指令稿:

# 產生 MD5 密碼雜湊
import random
import string
import crypt

# 密碼(明碼)
myPassword = 'hello123'

# 產生隨機的 slot
randomSalt = ''.join(random.sample(string.ascii_letters,8))

# 產生 MD5 密碼雜湊
myHash = crypt.crypt(myPassword, '$1$%s$' % randomSalt)

print(myHash)
$1$ympviwQO$ypOVhoNbR/5uXgtk9NZVA/

SHA-256 密碼雜湊

若要產生 SHA-256 的密碼雜湊,只要自己修改一下 ID 欄位的值即可,也就是將開頭的 $1 改為 $5,其餘程式碼都相同:

# 產生 SHA-256 密碼雜湊
import random
import string
import crypt

myPassword = 'hello123'
randomSalt = ''.join(random.sample(string.ascii_letters,8))

# 產生 SHA-256 密碼雜湊
myHash = crypt.crypt(myPassword, '$5$%s$' % randomSalt)

print(myHash)
$5$mHZziShP$ntL5UX68GG76VlcXMzmoerviugSaJF//j3WIDbsUOrA

SHA-512 密碼雜湊

產生 SHA-512 密碼雜湊的作法也是類似,將 $1 改為 $6 即可:

# 產生 SHA-512 密碼雜湊
import random
import string
import crypt

myPassword = 'hello123'
randomSalt = ''.join(random.sample(string.ascii_letters,8))

# 產生 SHA-512 密碼雜湊
myHash = crypt.crypt(myPassword, '$6$%s$' % randomSalt)

print(myHash)
$6$OCymiXEe$L/Dmqi7aHl.7zdtm9E4OP.chumBGVCy9DcTJTJYk3RMT3/hbz9k/oxERQS/h3rlsWI6GdzsFR/x5XqftotFzI/

參考資料:Linux 技術手札