跳至主要內容
>_ITDITD網站資安平台

名詞解釋

密碼雜湊是什麼 — 用不可逆的單向轉換安全保存密碼的機制

密碼雜湊是一種用不可逆的單向轉換來保存密碼的方法。本文隱去攻擊步驟、從防禦視角講解它與加密(可解密)的區別、直接使用 MD5 或 SHA-256 為何危險(彩虹表·暴力破解),以及正確做法 salt+慢速雜湊(bcrypt/Argon2/scrypt)。

發布於 2026-06-27 更新於 2026-06-27 閱讀時間 1 分鐘

「密碼不能『原樣』保存到資料庫裡」——那該怎麼保存呢?答案就是雜湊。本文講解其機制,以及保證安全的要點(不會寫出攻擊步驟)。

雜湊 ≠ 加密

兩者常被混淆,但目的恰好相反。**加密是「為了以後讀回,可用金鑰還原」**的轉換。雜湊是「無法還原(單向)」的轉換。密碼這種資訊,連營運方本來都不需要讀回,所以特意採用無法還原的雜湊更合適。

加密(可逆)

明文 密文。有金鑰就能還原。適用於以後要讀回的資料

雜湊(單向)

密碼 雜湊值。無法還原。適用於保存密碼

密碼用『無法還原』的雜湊來保存。與加密(可還原)的目的恰好相反。

登入時,要看的是「把輸入的密碼用同樣的步驟做雜湊,再和已保存的雜湊是否一致」。無需取出原始密碼。

為什麼「裸用 MD5/SHA-256」還不夠

MD5SHA-256快速雜湊。這本是有用的特性,但在密碼保存上卻成了弱點。因為攻擊者可以針對外洩的雜湊,每秒計算海量候選來逐一比對。

  • 彩虹表:把「常見密碼→其雜湊」預先計算好的巨大對照表。如果是裸雜湊,只要查表就能找到符合。
  • 暴力破解(brute force):雜湊越快,單位時間內能嘗試的候選越多=越容易被攻破。

讓它安全的兩個機制

1

加上 salt(每個使用者不同的值)

保存前,先為每個使用者混入一個不同的隨機值(salt),再做雜湊。這樣即使密碼相同,每個人的保存值也各不相同,彩虹表被廢掉,對重複使用密碼的批次破解也無從下手。

2

使用故意做得很慢的專用雜湊

bcrypt / Argon2 / scrypt 可以把計算有意做得很重(成本參數)。對正常登入的單次而言慢到無所謂,但能把攻擊者的暴力破解拖到現實中不可行的速度。salt 的添加也已內建其中。

本站觀點:不要自己拼湊

「給 MD5 加個 salt 不就夠了嗎?」——這正是典型的陷阱。安全的密碼保存,要把 salt 的產生與保管、計算成本的調節、對時序差異的考量都包含進來,才算成立。比起自己東拼西湊,交給語言、框架的官方密碼函式(很多內部都用 bcrypt/Argon2)來處理,在本站看來才是最安全、最可靠的。新專案請把 Argon2id 作為首選。

繼續閱讀

FAQ

Q雜湊和加密有什麼區別?
A

加密是『有金鑰就能還原(可解密)』的轉換,用於以後需要讀回資料的場景。雜湊是『無法還原(單向)』的轉換。密碼本來就不需要營運方讀回,所以特意採用無法還原的雜湊更合適。即便資料庫被盜,也無法從雜湊中直接取出原始密碼。

Q用 MD5 或 SHA-256 做雜湊就安全嗎?
A

僅此還不夠。MD5/SHA-256 是『快速』雜湊,攻擊者每秒能嘗試海量候選,因此常見密碼會被暴力破解或彩虹表(預先計算好的對照表)攻破。要做到安全,需要為每個使用者加上不同的『salt』,並使用『故意做得很慢』的專用雜湊(bcrypt·Argon2·scrypt)。

Q到底該用哪一個?
A

新專案首選 Argon2(尤其是 Argon2id),其次是 bcrypt 或 scrypt。它們的機制中都內建了 salt 的添加與計算成本的調節。比起自己拼湊 MD5+salt,使用這些標準實作(語言/框架的官方函式)更安全、更可靠。