原文連接: https://voidint.github.io/pos...php
如何生成一個Linux用戶登陸密碼?可能有人會說用passwd
生成。的確,passwd命令可以幫助咱們重置用戶登陸密碼,可是這並無解答如何生成一個Linux用戶登陸密碼
的疑問。html
對於這個問題,秉承着實用主義的精神,我本來也不會去深究。畢竟,安裝的時候會設置密碼,安裝完畢後能經過passwd
命令重置密碼,學會這兩點後已知足通常的需求已經綽綽有餘了。linux
可是,對於自動化而言,知道以上的兩點是不夠的。Linux的自動化安裝過程當中,設置用戶登陸密碼這事,確定不能有人爲干預,不然談什麼自動化。操做系統安裝完畢後,也有可能會有重置用戶密碼的自動化需求,此時使用passwd
命令來重置用戶密碼,也不見得是最佳的選擇。git
若是明白了密碼的生成機制,那麼這個自動化需求的難題也就迎刃而解了。github
有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段。咱們這裏只關注前兩段,至於每一段具體的含義,能夠戳這裏自行閱讀。第一段,是用戶名稱。第二段,即爲用戶密碼。其實密碼
這種稱呼並不許確。相對準確的說法是,用戶密碼明文通過某種哈希算法計算所得到的密文。可是,鑑於這個相對準確的說法實在太長太拗口,不便於表達。所以,如下提到的密碼
在無特別說明狀況下,一概指的是密碼明文的密文。docker
言歸正傳,看到這裏相信好多人會和我有同樣的思考: 是否是隻要知道了密碼生成的算法,並按照此算法生成一個知足Linux要求的密碼,再把密碼覆蓋這個第二段的內容,那麼用戶密碼就被重置了嗎?shell
仔細看這段密碼,會發現它是由$xxx$xxx$xxx
的格式構成,即由$
符號分隔的3端字符串構成。查閱資料後得知,這個格式能夠進一步歸納爲$id$salt$encrypted
。簡要說明下$id$salt$encrypted
中各個部分的含義:centos
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=yyy
。yyy
是一個由用戶(調用方)提供的[1000, 999999999]
之間的整數。
知道了上面這部分基礎知識,那麼接下來就是理論指導實踐
的環節了。具體能夠藉助什麼工具來生成密碼呢?這裏使用的grub-crypt
工具。你能夠在某個Linux發行版中安裝這個工具,也可使用我提供的這個dockerfile。
$ 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::::::