Linux使用者登入密碼的生成

voidint發表於2017-10-29

原文連結: https://voidint.github.io/pos...

一、從自動化需求說起

如何生成一個Linux使用者登入密碼?可能有人會說用passwd生成。的確,passwd命令能夠幫助我們重置使用者登入密碼,但是這並沒有解答如何生成一個Linux使用者登入密碼的疑問。

對於這個問題,秉承著實用主義的精神,我原本也不會去深究。畢竟,安裝的時候會設定密碼,安裝完畢後能通過passwd命令重置密碼,學會這兩點後已滿足一般的需求已經綽綽有餘了。

但是,對於自動化而言,知道以上的兩點是不夠的。Linux的自動化安裝過程中,設定使用者登入密碼這事,肯定不能有人為干預,否則談什麼自動化。作業系統安裝完畢後,也有可能會有重置使用者密碼的自動化需求,此時使用passwd命令來重置使用者密碼,也不見得是最佳的選擇。

如果明白了密碼的生成機制,那麼這個自動化需求的難題也就迎刃而解了。

二、密碼生成理論

有Linux基礎的人一定知道,Linux的使用者登入密碼資訊是存放在/etc/shadow檔案當中的,並且該檔案只有root使用者能夠訪問。以下會以voidint這個使用者為例,看一下這個使用者的密碼資訊。

$ sudo cat /etc/shadow | grep voidint
[sudo] password for voidint:
voidint:$6$3kheX/Vg$TGum9JEjfmGsj8Mfk3SUY/d/bWkJgnRimCxoaDTX7wcgrraYvU.fiziEUdpDglWc58uPZqWJhKNjiXayP9Q6b0:16892::::::

很明顯,這個字串被:符號分隔成了9段。我們這裡只關注前兩段,至於每一段具體的含義,可以戳這裡自行閱讀。第一段,是使用者名稱稱。第二段,即為使用者密碼。其實密碼這種稱呼並不準確。相對準確的說法是,使用者密碼明文經過某種雜湊演算法計算所獲得的密文。但是,鑑於這個相對準確的說法實在太長太拗口,不便於表達。因此,以下提到的密碼在無特別說明情況下,一律指的是密碼明文的密文。

言歸正傳,看到這裡相信好多人會和我有一樣的思考: 是不是隻要知道了密碼生成的演算法,並按照此演算法生成一個滿足Linux要求的密碼,再把密碼覆蓋這個第二段的內容,那麼使用者密碼就被重置了嗎?

仔細看這段密碼,會發現它是由$xxx$xxx$xxx的格式構成,即由$符號分隔的3端字串構成。查閱資料後得知,這個格式可以進一步概括為$id$salt$encrypted。簡要說明下$id$salt$encrypted中各個部分的含義:

  • id: 加密(確切說是雜湊)所用演算法的代號。
ID Method
1 MD5
2a Blowfish (not in mainline glibc; added in some Linux distributions)
5 SHA-256 (since glibc 2.7)
6 SHA-512 (since glibc 2.7)
  • salt: 由程式隨機生成的字串,即)。
  • encrypted: 使用者密碼明文字串加鹽後使用雜湊演算法所得的雜湊值,即雜湊(明文+鹽)

特別說明

資料中還提到了另外一種形式的密碼——$id$rounds=yyy$salt$encrypted。其中,鹽的部分換成了rounds=yyyyyy是一個由使用者(呼叫方)提供的[1000, 999999999]之間的整數。

三、密碼生成實踐

知道了上面這部分基礎知識,那麼接下來就是理論指導實踐的環節了。具體可以藉助什麼工具來生成密碼呢?這裡使用的grub-crypt工具。你可以在某個Linux發行版中安裝這個工具,也可以使用我提供的這個dockerfile

  • 使用sha512演算法生成密碼
$ grub-crypt --sha-512
Password:
Retype password:
$6$r1jcut3Crl8bSIMo$XfKnrl4Ykzk2KPQ59MCXcUef9OjZWoZrIp7aeWwnCzIVQY1p/G1EiJQE4DYFej783NlvR5KtKYXs4P/hQaVst.
  • 將生成的密碼寫入/etc/shadow檔案中(該檔案只有root使用者才有許可權讀寫,若root也無許可權,則賦予600許可權即可)
$ sudo cat /etc/shadow | grep voidint
voidint:$6$r1jcut3Crl8bSIMo$XfKnrl4Ykzk2KPQ59MCXcUef9OjZWoZrIp7aeWwnCzIVQY1p/G1EiJQE4DYFej783NlvR5KtKYXs4P/hQaVst.:16892:::::: 
  • 退出當前使用者並使用新修改的密碼登入

四、參考

相關文章