密碼到底該用 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:不可逆,用於驗證
* 對稱式加密:可解密,用於保護資料
* 非對稱式加密:用於身分驗證與安全傳輸
理解這些基礎概念後,才能在開發系統時,選擇正確的保護方式。
保護資料,不只是資安工程師的工作,也是每位工程師都應該具備的基本能力。
點擊複製文章連結