linux忘記root密碼怎麼辦?
昨天,有個妹子問了我一個問題,她忘記了自己centos的root密碼,問我應該怎麼辦。我想也沒想就答道:準備好重裝系統吧!
時間彷彿回到了一年前,我照著linux書倒騰新安裝的ubuntu系統,在/etc/sudoers文件中徘徊時突發奇想,如果我把裡邊我的sudoer許可權去除,系統會不會阻止我這樣做。真是好奇心害死貓,三天後我重裝了系統。不小心革掉了自己的命。所以說,linux系統認為用戶知道自己在做什麼,把所有的權力都給了用戶自己。總之,在探索linux系統的過程中,我重裝了系統不下5次。。。
linux賬戶保存在/etc/passwd,密碼保存在/etc/shadow文件中。前者無需超級用戶許可權即可閱讀。
? ll /etc/passwd /etc/shadow-rw-r--r-- 1 root root 2.6K 3月 9 11:26 /etc/passwd-rw-r----- 1 root shadow 1.6K 3月 31 10:42 /etc/shadow
通過
man 5 passwd
,man 5 shadow
可查看文件中各欄位含義。
但是,一年以後,當再次被問起這個問題時,我又思考了一下。如果你只有root用戶,而忘記了密碼,那沒辦法,即使暴力破解或者字典破解,由於你不知道加密演算法中使用的salt,是破解不了的。
但是如果你的某個用戶擁有sudoer許可權的話,即使忘了root密碼,也還是可以修改的。可能你並不了解這裡面的加密演算法以及salt是什麼,別急,接下來我把背景知識補充一下。
什麼是加密函數?
密碼的散列存儲
如果你用過ss科學上網,你可能聽說過一下這些中的某一個:
1. none 2. rc4 3. rc4-md5 4. rc4-md5-6 5. aes-128-ctr 6. aes-192-ctr 7. aes-256-ctr 8. aes-128-cfb 9. aes-192-cfb 10. aes-256-cfb 11. aes-128-cfb8 12. aes-192-cfb8 13. aes-256-cfb8 14. salsa20 15. chacha20 16. chacha20-ietf
AES,SHA1,DES,RSA,MD5區別 - CSDN博客 這裡有一篇文章專門講這些加密方式的區別
總而言之,如果你的密碼以明文的方式直接存儲在資料庫中是很危險的。於是我們想了一種辦法,對密碼進行SHA512加密,所謂加密,你可以理解為一個函數,確切的說是一個不可逆的散列函數(哈希函數),當你把密碼當做這個函數的輸入,會輸出一串加密過的密碼,如果你的機器被黑客黑了,他最多只能得到你加密過的密碼。同樣,每次你輸入密碼,系統會把密碼輸入哈希函數,拿輸出的值與資料庫中的值比較,如果你們有相同的輸出,則你們是同一個人,如果函數的輸出不同,你們就不是一個人。
比如:
mkpasswd -m sha-512Password: apple$6$LyVpT/aetS$mTDFTG9SzM7iVdP7Kqz6q2lsvgqjA45qXDAEcIUV/eEAaOGreCbd1XMet8itx7z1XM1ZFCb3UUd3toBozQiuZ.
在ubuntu系統中使用
sudo apt-get install whois
可以獲得這個mkpasswd
命令,通過這個命令我們可以對密碼進行加密。
我們看到,如果你的密碼是apple
,密碼的散列值貌似是這麼一長串。實際上,這一長串密碼被"$"分割,第一個阿拉伯數字,代表了加密方法的種類, 這裡6就代表了sha-512這種加密方式。第二個我們一會再說。第三個即為apple
的散列值。系統中不存儲apple
這個密碼,存儲的是下面的散列值。當你再次輸入密碼的時候,會再次生成散列值,用於和資料庫中的進行比較。
什麼是salt?
舉個例子,比如,如果你的密碼僅僅是一個單詞,黑客有一本字典,這個字典的每個單詞後面都對應了這個單詞的散列值。然後黑客看著你經過加密的密碼,一頁一頁翻看字典。沒翻幾頁他就發現,單詞apple
的散列值咋和你加密過的密碼一樣?
加Salt可以一定程度上解決這一問題。所謂加Salt,就是加點「佐料」。其基本想法是這樣的——當用戶首次提供密碼時(通常是註冊時),由系統自動往這個密碼里撒一些「佐料」,然後再散列。而當用戶登錄時,系統為用戶提供的代碼撒上同樣的「佐料」,然後散列,再比較散列值,已確定密碼是否正確。
我們剛才看到的$6$LyVpT/aetS$mTDFTG9SzM7iVdP7Kqz6q2lsvgqjA45qXDAEcIUV/eEAaOGreCbd1XMet8itx7z1XM1ZFCb3UUd3toBozQiuZ.
這一串密文中, LyVpT/aetS
即為加入的「鹽」。
如何修改密碼?
tom:$6$iXDRKGEq$3FdFbXuwnPk7lSozGCsIws3q/o3HhYYpdiKqt6cQ3yGMIQxMLO93KXRAgD5uJJaCQhvZOiuEwkh6ti8I3AYL50:17599:0:99999:7:::
我在linux中添加了一個用戶tom來作為演示。 這天tom忘記了自己的密碼,很著急,想知道如何找回密碼。我說,密碼是找不回了,但是我可以幫你修改原來的密碼。
於是乎,我把上面apple
的散列值替換了tom的散列值。
tom:$6$LyVpT/aetS$mTDFTG9SzM7iVdP7Kqz6q2lsvgqjA45qXDAEcIUV/eEAaOGreCbd1XMet8itx7z1XM1ZFCb3UUd3toBozQiuZ.:17599:0:99999:7:::
「tom你好, apple
就是你現在的新密碼了。」
如果你沒有超級用戶許可權,也忘了密碼的話,可以啟用單用戶模式,上面是鏈接。
如果你有sudo許可權,sudo passwd root
就行,這篇文章提供了一種新的視角,您就當科普文看吧。
另外,本來就是邊玩邊分享,遇到問題一個人研究後有了新發現很激動,想分享給大家,因為很少有人通過改/etc/shadow來改密碼。雕蟲小技,恕我班門弄斧了??。有一兩個人的評論很惡意哦??。
推薦閱讀:
※vmware, visual studio, steam dota2這種需要極大內存的程序是如何分配內存的?
※Linux吃掉了我的內存
※能否通俗易懂,深入淺出地解釋一下linux中的掛載的概念?
※Linux 為何不把圖形用戶界面寫入內核?