---
# System prepended metadata

title: 為何會員密碼需要雜湊加密

---

{%hackmd theme-dark %}
# 為何會員密碼需要雜湊加密
### 關於
這個文章是為了回應一位好友而寫，主要說明為何會員的密碼需要雜湊加密。
## 正文
### 密碼
引述自維基百科:  
>密碼或稱為`口令`、`通行字`、`通行碼`，`口令`原來的意義是口頭暗號，也叫「通行字」，是一個用於身份驗證的保密的字符串。

由上述可知，密碼本身是需要『保密』的，知道的人、或儲存的位置越少越好，甚至就連密碼驗證端也最好不知道密碼，總的來說，就是『無人知道的秘密不會被外洩』。
### 系統中的密碼
系統中儲存雜湊過的密碼，並沒有什麼深刻的理由，純粹只是因為更安全而已。
以下就儲存密碼的方式來分析其風險。
1. **`明文`**
   明文儲存的風險非常大。
   在資料外流等事件中，明文密碼造成的是所有外流帳號都不再安全，其損失可能難以估計，甚至會波及其他系統，因為有許多使用者會在不同網站中使用相同密碼。（此處不考慮 `OTP`）
   並且明文儲存對於內部人員是不利的。人性難測，對於 DBA、PG、OP 等眾多可以接觸到帳號密碼的內部人員，企業無法預期他們是否會惡意存取會員帳號，或者將這些密碼拿去嘗試於其他系統等，尤其是涉及金融服務的系統，其『誘惑』更大。
2. **`可逆密文`**
   可逆密文同樣存在風險，但是比明文小的多。
   可逆密文的風險在於，解密金鑰同樣可能外洩；而即便金鑰保存良好，但駭客同樣可能藉由[選擇明文攻擊](https://zh.wikipedia.org/wiki/選擇明文攻擊)等方式來破解出解密金鑰，而解密金鑰只要被破解或取得一次，則相當於所有帳號都被破解。
   並且，對於有權存取解密金鑰的內部人員而言，同樣會存在如明文儲存中的誘惑力。
3. **`不可逆密文`**
   不可逆密文即為雜湊加密，是目前主流的密碼儲存格式。
   不可逆密文依然具有風險，但是比可逆密文更低。
   在遭遇資料外洩的事件時，使用雜湊加密儲存的密碼保證了攻擊者無法在短時間內回推明文，即便攻擊者知道系統所使用的雜湊演算法、[Salt](https://zh.wikipedia.org/wiki/%E7%9B%90_(%E5%AF%86%E7%A0%81%E5%AD%A6))，甚至連 [HMAC](https://zh.wikipedia.org/wiki/%E9%87%91%E9%91%B0%E9%9B%9C%E6%B9%8A%E8%A8%8A%E6%81%AF%E9%91%91%E5%88%A5%E7%A2%BC) 的加密金鑰都知道了，也會因為其不可逆的特性而被迫以窮舉法的方式來取得明文，並且該窮舉法必須對所有帳號都執行，而非如可逆密文一般，破解一次即取得全部密碼。

### 結論
如上一節開頭所述，系統中儲存雜湊過的密碼，並沒有什麼深刻的理由，純粹只是因為更安全而已。

### 額外內容
雖然都是雜湊加密演算，但是依照實作方式，依然可能出現安全性風險，以下列出一些需要注意的事項：
1. 不要用 [`md5`](https://zh.wikipedia.org/wiki/MD5) 進行雜湊，因為這種雜湊方式已經被證實可以破解
2. 一定要加[鹽](https://zh.wikipedia.org/wiki/%E7%9B%90_(%E5%AF%86%E7%A0%81%E5%AD%A6))，用於防止[彩虹表](https://zh.wikipedia.org/wiki/%E5%BD%A9%E8%99%B9%E8%A1%A8)
3. 考慮使用 [HMAC](https://zh.wikipedia.org/wiki/%E9%87%91%E9%91%B0%E9%9B%9C%E6%B9%8A%E8%A8%8A%E6%81%AF%E9%91%91%E5%88%A5%E7%A2%BC)

參考報導
- https://www.ithome.com.tw/news/117253
- https://buzzorange.com/techorange/2019/03/22/facebook-stored-users-password/



