Skip to content

2026-08-10

/ 13 分鐘閱讀

/ Full Stack Fundamentals

為什麼伺服器不能用密碼登入:SSH 金鑰、雜湊與 MD5 彩虹表攻擊

上一篇回顧 VPS 設定進度時提到,伺服器建好之後下一步是決定登入方式,並預告會改用 SSH 金鑰而非密碼。這一節就從「為什麼帳號密碼不適合用在伺服器上」出發,一路講到 SSH 金鑰背後的雜湊(hashing)原理。

帳號密碼登入的問題

建立伺服器或應用程式時都需要一套登入機制,多數人習慣用帳號密碼,因為門檻低、大家都用慣了。但帳號密碼有不少實際弱點:

  • 憑證容易被偷:其他人拿到帳密就能直接登入
  • 容易被猜到:許多人使用的密碼高度可預測
  • 可能在傳輸過程中被側錄(sniffed)
  • 容易遺忘:使用者常常忘記自己的密碼

這些問題背後其實是人類行為的問題,而不只是技術問題:「password」至今仍是網路上最常見的密碼,即使大家都聽過各種資安外洩事件,人類還是很難改變自己的習慣,持續重複使用同一套容易預測的模式。

生物辨識(biometric)登入是另一個選項,但目前普及率不高:大多數裝置並不支援,也還沒有統一的標準,未來十年隨著標準成熟可能會更普及,但現階段還不成熟。

為什麼選 SSH 金鑰

課程選擇的登入方式是 SSH 金鑰。SSH 是伺服器身份驗證中最強大的機制之一,幾乎不可能被用錯,也幾乎不可能被猜中。雖然不能說「絕對」不會被破解(例如未來量子運算的發展仍是未知數),但在可預見的未來,SSH 金鑰被猜中的機率極低,遠比一般密碼安全。

即使是一組看起來夾雜符號與字元的長密碼,用一般桌上型電腦大約兩年就能被暴力破解;如果換成專門用來破解密碼的硬體,可能幾秒鐘就能破解。更麻煩的是,人類選密碼的方式其實非常有規律:常常只是把字母替換成看起來相似的符號(例如用 @ 取代 a),但破解者早就掌握這些替換規律,這種密碼的「熵」(entropy,代表隨機程度)其實很低。

真正安全的密碼必須是完全由電腦亂數產生的,而不是人腦想出來的。講師示範用密碼管理器 1Password 產生一組亂數密碼,並強調自己完全不知道任何一組登入密碼,只記得 1Password 本身的主密碼。他推薦使用 1Password 或 KeePass 之類的密碼管理器,並特別提醒不要使用 LastPass,因為它的資安紀錄很有問題。

伺服器安全格外重要,因為一旦有人取得伺服器的存取權,就能拿它做任何事:挖礦、發動 DDoS 攻擊、散布非法內容等等,而出事後責任會算在伺服器持有人頭上。這也是為什麼伺服器的登入方式,理論上應該比銀行、手機等任何系統都更嚴格。

字典攻擊:為什麼「自以為隨機」的密碼不安全

資安領域有一種手法叫字典攻擊(dictionary attack):把常見的密碼變化規律(例如在單字後面加數字、用符號取代字母)都收錄進字典,電腦只要幾毫秒就能把整套英文字典跑過一遍,逐一比對。所以即使自認為想出一組很有巧思的密碼(例如某個單字加上數字),只要這種變化規律夠常見,也一樣會被輕易破解。

雜湊(hashing)是什麼

SSH 金鑰背後真正的核心概念是雜湊(hashing)。雜湊指的是把一段資料(一串位元與位元組)丟進一個數學函式(雜湊函式)運算,輸出的結果就叫做雜湊值(hash)。簡單說,雜湊就是「輸入一段資料,經過運算後,得到一串固定格式的數字、字母與字元」。雜湊值可以用在加密、驗證資料完整性等不同用途,而且能用很小的一串字元代表一大段資料。

雜湊函式有很多種,其中最早被廣泛認識的一種叫 MD5,過去常被用來當作密碼的加密雜湊:把密碼丟進 MD5 運算,得到一串看似隨機的數字。

用 OpenSSL 實際示範 MD5 雜湊

這些工具都內建在 Unix / Linux 系統裡,講師直接在終端機示範。先把字串 password 寫進一個叫 foo 的檔案:

bash
echo password >> foo
cat foo

>> 代表把內容附加到檔案裡(append),細節會在課程後面談重導向(redirection)時進一步說明。接著用 OpenSSL 對這個檔案做 MD5 雜湊運算:

bash
openssl md5 foo

OpenSSL 是一套實作 TLS 安全層、遵循密碼學標準的加密工具組,內建 MD5、SHA-1、SHA-256 等多種雜湊演算法。輸出結果可以再用 awk 這個文字處理工具進一步篩選欄位,只取出需要的那一段內容;awk 是一套「依模式掃描與處理文字」的工具,很適合搭配 Unix 標準輸出以欄位為單位的特性,把一大段輸出精簡成只留下真正需要的部分。真正熟悉指令列的人常常會把 awksedgrep 這類工具串在一起用,看起來像變魔術一樣,能從一個龐大的日誌檔案裡瞬間抓出真正關心的資訊。

為什麼 MD5 不再安全:彩虹表攻擊

執行完 openssl md5 foo 之後,會發現一個問題:每個人跑出來的雜湊值都完全一樣。這代表只要把所有常見密碼都先用 MD5 算過一遍雜湊值,就能做出一張「雜湊值對應原始密碼」的對照表,這就是彩虹表(rainbow table)。

彩虹表本質上是把大量雜湊輸出結果,對應回它們原本代表的常見單字或密碼。電腦要產生這種對照表非常容易,幾乎英文字典裡的每個單字、每種常見密碼組合的 MD5 雜湊值都已經被人整理好了。正因為同樣的輸入永遠會得到同樣的輸出,MD5 早就不再被用來儲存密碼,因為它太容易被彩虹表破解。

複習

使用帳號密碼登入有哪些主要的安全風險?

密碼可能被偷、被猜到、在傳輸過程中被側錄、容易遺忘,而且人類傾向使用可預測的密碼模式,很容易被字典攻擊破解。

什麼是彩虹表(rainbow table)?

彩虹表是預先算好的雜湊值對照表,把大量雜湊輸出結果對應回原本的單字或密碼組合,攻擊者只要比對雜湊值,就能快速反推出原始密碼。

什麼是雜湊(hashing)?

雜湊是把輸入資料透過數學函式運算,轉換成一串固定格式輸出(數字、字母、字元)的過程,可以用於資料驗證、加密與安全儲存等用途。

小測驗

產生安全密碼建議採用什麼方法? 使用電腦亂數產生的密碼
為什麼 SSH 金鑰登入被認為比密碼登入更安全? SSH 金鑰極難被猜中或破解
雜湊函式的根本作用是什麼? 把任意大小的輸入資料轉換成固定大小的輸出

此文章是 FrontendMasters 上的 Full Stack Fundamentals, v3 課程筆記

最後更新時間:

Buy Me A Coffee
0 %
MIT Licensed | Copyright © 2025-present Wen-Hsiu's Blog
Photo by Federica Galli on Unsplash