English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

guest
1 / ?
back to lessons

什麼樣的儲存格式是可還原的

四種儲存格式,按可還原性排序:

格式可還原?範例還原方法
明文password: hunter2讀取檔案
Base64cGFzc3dvcmQ=base64 --decode
可逆加密(AES)ENC[AES256:...]使用金鑰解密
單向雜湊(bcrypt)$2b$12$...無法還原;必須暴力破解

明文、Base64 與可逆加密:皆可還原。單一憑證資料庫外洩,即讓攻擊者同時取得所有使用者的明文密碼。一次漏洞,全面暴露。

Mailman 2.x 範例

Mailman 2.x(GNU 郵件清單管理器)將訂閱者密碼以明文儲存。每月密碼提醒郵件會以明文寄送所有訂閱者的密碼。兩個獨立的缺陷,皆屬 MOAD-0006:

1. 儲存:清單資料庫中的明文。伺服器遭入侵即暴露所有訂閱者密碼。

2. 廣播:每月郵件透過 SMTP 以明文將密碼傳送至訂閱者的郵件伺服器。郵件在多個 SMTP 節點間以明文傳輸。

Mailman 團隊設計了這兩種行為。恢復功能是其特色:訂閱者可以取回忘記的密碼。Glass Safe 的名稱由此而來:保險箱以可見的形式存放憑證。任何能接觸到保險箱的人,都能同時讀取所有內容。

已遭竊取原則

以可恢復形式儲存的憑證,等同於已經被竊取的憑證。攻擊者尚未到達,漏洞尚未發生,但架構已保證:一旦發生漏洞,所有憑證將同時失陷。漏洞不會孤立發生;可恢復儲存中的每一組憑證,都會在同一次操作中轉移給攻擊者。

MOAD-0006 與 MOAD-0004 之比較

MOAD-0004(已記錄的機密):憑證意外寫入日誌。寫入日誌並非原本意圖,而是啟用標頭記錄以進行除錯時的副作用。

MOAD-0006(Glass Safe):憑證依設計以可恢復形式儲存。恢復功能是其目的。密碼提醒功能需要儲存密碼,顯示密碼功能也需要儲存密碼。對恢復功能的架構承諾,造成了此缺陷。

一行區別:MOAD-0004 是意外將憑證放入日誌;MOAD-0006 則是刻意以可恢復形式儲存憑證。兩者的修復層級不同。

結構性與意外性

MOAD-0006 與 MOAD-0004 的架構差異決定了修復策略。意外寫入日誌:修復序列化層。設計用於恢復的儲存:重新設計需要恢復的功能。

為什麼 Glass Safe 在結構上與 MOAD-0004 不同?請用一行描述每個缺陷。這對修復意味著什麼?

為什麼 bcrypt 有效

單向雜湊函式接受密碼並產生固定長度的摘要。給定摘要後,無法還原原始密碼。不是「難以還原」,而是無法反向運算。函式只能單向執行。

儲存憑證所需的三個屬性:

1. 單向(原像抗性)。 給定 hash(password),沒有任何演算法能比暴力破解更快地還原 password。bcrypt、scrypt 與 argon2 皆滿足此屬性。

2. 鹽值。 在密碼雜湊前先附加一個隨機值。同樣的密碼搭配不同的鹽值,會產生不同的雜湊值。目的:防禦彩虹表(預先計算的雜湊字典)。若無鹽值:攻擊者只需計算一次 hash('password123'),即可同時檢查所有一百萬名使用者。若有鹽值:即使密碼相同,每位使用者仍擁有獨一無二的雜湊值。

3. 刻意設計為緩慢。 bcrypt 接受工作因子。工作因子越高,每次雜湊所需的迭代次數與運算時間就越多。登入時:一次雜湊只需 300 毫秒,可接受。暴力破解時:每次嘗試需 300 毫秒。若需十億次嘗試,則每組密碼需花費 9.5 年。對攻擊者而言不可行。此緩慢特性是一項功能,而非缺陷。

import bcrypt

# 儲存:使用鹽值進行單向雜湊
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))

# 驗證:對候選密碼進行雜湊並比較摘要
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)

# 永不儲存:明文密碼
# 永遠無法還原:從雜湊值取得明文
# 密碼重設,而非密碼提醒

權衡

單向雜湊使得密碼還原變得不可能。忘記密碼的使用者無法取回原始密碼。系統無法發送「密碼提醒」郵件。使用者體驗因此改變:「忘記密碼?請重設。」這不是功能退化,而是安全邊界。無法還原密碼的系統,也就無法洩漏密碼。

資料庫外洩若暴露 bcrypt 雜湊值:所有雜湊值可見,但沒有任何密碼可見。攻擊者必須針對每個雜湊值進行暴力破解,每次嘗試需 300 毫秒,且因每位使用者使用獨立鹽值而無法使用預先計算的彩虹表。若外洩的是明文密碼:則會造成立即且全面的暴露。

強加密仍不足

某安全稽核發現一組憑證儲存系統。密碼使用 AES-256-CBC 加密,並搭配伺服器端金鑰。稽核報告將此標記為 Glass Safe 缺陷。

工程團隊回應:「AES-256 是目前最強的對稱式加密演算法。金鑰存放在硬體安全模組(HSM)中,任何攻擊者都無法解密這些密碼。」

為什麼即使使用強加密,這仍然是 MOAD-0006?正確的修正方式是什麼?