WeHelp
密碼到底該用 Hash 還是加密?
2026-06-13 16:41:12
在這篇 [剛入行工程師一定要建立的幾個安全觀念](https://wehelp.tw/topic/6324429340540928) 有提到: > 敏感資料不要明文存放。 但實際開發時,很多人會有一個疑問: > 使用者密碼到底應該加密,還是 Hash? 其實這兩者是完全不同的概念。 --- ## Hash(雜湊) Hash 的特性是: * 單向運算 * 不可逆 * 相同輸入一定得到相同結果 例如: ```text password123 ↓ ef92b778bafe771e... ``` 理論上無法從結果反推出原始內容。 因此密碼儲存通常會使用 Hash,而不是加密。 --- ## 對稱式加密(Symmetric Encryption) 對稱式加密使用同一把金鑰: ```text 明文 ↓ 加密 ↓ 密文 ↓ 解密 ↓ 明文 ``` 常見演算法: * AES * DES(現今已較少使用) 適合: * 敏感資料儲存 * API 傳輸資料 * 設定檔中的機密資訊 因為未來仍需要將資料還原。 --- ## 非對稱式加密(Asymmetric Encryption) 非對稱式加密使用兩把金鑰: * Public Key(公開金鑰) * Private Key(私有金鑰) 常見演算法: * RSA * ECC 用途包括: * HTTPS * 數位簽章 * 身分驗證 即使公開了 Public Key,在目前可行的計算能力下,也無法在合理時間內推算出 Private Key。 因此可以安全地公開 Public Key,而將 Private Key 保存在伺服器端。 --- ## Hash 與加密最大的差異 | 特性 | Hash(雜湊) | 加密(Encryption) | | ------ | --------- | --------------- | | 是否可還原 | ❌ 不可逆 | ✅ 可解密 | | 是否需要金鑰 | ❌ 不需要 | ✅ 需要 | | 主要用途 | 驗證資料 | 保護資料 | | 常見情境 | 密碼儲存、檔案校驗 | 信用卡號、身分證字號、資料傳輸 | 很多人會把 Hash 當成一種加密方式。 但實際上: > Hash 的目的是驗證,而不是保護資料讓未來可以還原。 --- ## 為什麼密碼不用加密? 很多人會想: > 既然可以加密,那把密碼加密存起來不就好了? 問題在於: 如果系統能解密密碼, 代表只要取得解密金鑰的人,也能看到所有使用者的原始密碼。 這其實增加了風險。 因此密碼通常使用 Hash,而不是可逆的加密。 --- ## 登入時怎麼驗證密碼? 系統其實不需要知道你的原始密碼。 註冊時: ```text password123 ↓ Hash ↓ 存入資料庫 ``` 登入時: ```text 使用者輸入 password123 ↓ 再次 Hash ↓ 與資料庫中的 Hash 值比較 ``` 範例: ```csharp var inputPassword = "password123"; var inputHash = HashPassword(inputPassword); if (inputHash == user.PasswordHash) { // 登入成功 } ``` 整個過程中,系統不需要將密碼解密。 --- ## 更安全的做法:Salt 如果兩位使用者剛好都使用: ```text password123 ``` 產生的 Hash 也會相同。 例如: ```text password123 ↓ Hash ↓ abc123 password123 ↓ Hash ↓ abc123 ``` 這會產生一個問題: 如果資料庫不幸外洩,駭客可能利用現成的「彩虹表(Rainbow Table)」快速比對大量常見密碼的 Hash。 例如: ```text 123456 → e10adc3949... password → 5f4dcc3b5a... password123 → ef92b778ba... ``` 一旦比對成功,就可能一次破解大量帳號。 因此現代系統通常會加入隨機 Salt: ```text password123 + x8A2fP ``` 即使兩位使用者使用相同密碼, 最終產生的 Hash 也會不同。 常見方案: * BCrypt * PBKDF2 * Argon2 這些演算法都已經內建 Salt 與防暴力破解機制。 實務上通常不建議自行實作 Hash 演算法,而是直接使用成熟且經過驗證的方案。 --- ## 結語 很多人剛接觸資安時,會認為: > Hash 就是一種加密。 但實際上: * Hash:不可逆,用於驗證 * 對稱式加密:可解密,用於保護資料 * 非對稱式加密:用於身分驗證與安全傳輸 理解這些基礎概念後,才能在開發系統時,選擇正確的保護方式。 保護資料,不只是資安工程師的工作,也是每位工程師都應該具備的基本能力。