下載頁面的那串指紋是什麼?
韌體下載頁上常會出現 `a3f5…9e2c` 這類字串。這是根據檔案算出的 digest,用來比較資料是否一致;它不負責加密檔案,也不包含秘密金鑰。
十張圖依序說明 digest、三大抗性、生日悖論、分塊處理與 SHA-1 退場,最後再把 SHA 放回數位簽章、HMAC、Merkle Tree、Secure Boot、OTP、PUF 與 KDF 等完整系統,釐清各自需要的金鑰、信任根與驗證規則。
1. 那些很長的十六進位字串是什麼?
SHA 是 Secure Hash Algorithm 的縮寫。把檔案、文字、圖片或任意位元序列送進 SHA,演算法會輸出一段固定長度的位元字串。SHA-256 的輸出是 256 bits,也就是 32 bytes;改寫成十六進位時會有 64 個字元。畫面中的 a3f5…9e2c 只是為了版面而省略中間內容,真正拿來驗證時必須比較完整值。[1]
「數位指紋」是一個好用的比喻:它短、容易比較,而且理想上能代表原始資料的狀態。不過,雜湊值不是人類指紋的法律身分證明。若參考雜湊值本身來自不可信網站,攻擊者可以同時換掉檔案與雜湊值。檔案完整性檢查要成立,前提是你先從可信管道取得正確的參考值;更強的做法是用數位簽章驗證來源與完整性。
還有一個最常見的誤會:SHA 不負責加密。加密的目標是讓持有正確金鑰的人能解密;雜湊的目標是把資料映射成摘要,沒有「解密回去」這個操作。
2. Digest:長短不同,輸出一樣長
固定長度是雜湊函式最醒目的特徵。短訊息與長檔案都會被壓到同一個輸出空間。這不表示大量資料真的被「無損壓縮」進 256 bits;因為輸入集合遠大於輸出集合,數學上一定存在不同輸入得到同一個 digest。碰撞在數學上必然存在;安全性取決於找到碰撞是否困難到實務上不可行。
圖中 Hello 與 hello 只差大小寫,digest 卻看不出任何規律關係,這是雪崩效應的直覺。好的密碼雜湊函式會讓輸入的細小變化快速擴散到整個輸出,攻擊者無法靠「輸入差一點,輸出也只差一點」逐步逼近答案。
同樣的輸入在同一套演算法下,一定得到同樣的 digest。SHA 本身沒有隨機性;若應用需要 salt、key 或 nonce,那些是上層協定加入的資料。也因此,直接拿 raw SHA-256 存密碼並不理想:相同密碼仍會得到相同結果,而且一般 SHA 算得太快,反而方便攻擊者大量猜測。
3. 三大抗性到底在防誰?
原像抗性(preimage resistance)是:只給一個目標 digest h,要找任意訊息 m 使 H(m)=h 很困難。這像拿到指紋後,想反推出一份能產生該指紋的文件。對理想的 n-bit 雜湊函式,暴力工作的量級約為 2^n。[2]
第二原像抗性(second-preimage resistance)是:已知一份特定訊息 m₁,要找另一份不同訊息 m₂,而且 H(m₁)=H(m₂) 很困難。攻擊者不能任意挑兩份文件;其中一份已經被指定。這和「拿既有合法韌體,另做一份 digest 相同的惡意韌體」很接近。
碰撞抗性(collision resistance)則允許攻擊者同時挑兩個輸入,只要求兩者不同且 digest 相同。自由度變大後,攻擊難度會明顯下降。對理想 n-bit 雜湊函式,生日攻擊把通用碰撞工作的量級降到約 2^(n/2)。
這三個數字不能互換。SHA-256 的理想原像強度約 256 bits,理想碰撞強度約 128 bits;「256-bit 輸出」不代表所有攻擊都需要做 2^256 次。
4. 生日悖論:為什麼碰撞只剩平方根等級?
23 人可以形成 253 組配對。生日悖論計算的是任意一組同生日的機率,而非大家和某個指定日期相同的機率。每多一個人,就會增加一整排和既有人員的比較機會。配對數快速增加,所以重複生日比直覺早出現。
把 365 天換成 2^n 個可能 digest,原理相同。攻擊者不必命中某個指定 digest,只要蒐集大量輸入,找到其中任意兩個輸出相同即可。大約看過 2^(n/2) 個隨機結果後,碰撞機率就進入不可忽略的區域。
因此,128-bit digest 的理想碰撞安全強度只有約 64 bits;SHA-1 的輸出是 160 bits,理想碰撞界線約 80 bits;SHA-256 則約 128 bits。這是為什麼評估簽章、憑證與內容完整性時,要看 collision resistance,而不能只看輸出有幾位元。
5. Merkle–Damgård:長資料怎麼一段一段壓進去?
SHA-1 與 SHA-2 家族採用迭代式結構。以 SHA-256 為例,訊息會先 padding,加入分隔位元、必要的 0,以及原始訊息長度,再切成 512-bit blocks。演算法從固定初始值開始,逐塊更新 256-bit internal state,最後狀態就是 digest。
接力賽的比喻很貼切:每一棒不只看自己的區塊,也接過上一棒的狀態。只要前面任何一段改變,後面的鏈結值就會跟著改變。這讓演算法能用固定大小的硬體資料路徑處理很長的訊息,也能用串流方式逐塊吸收資料。
但這類結構也有使用上的陷阱。若有人把 SHA-256(secret || message) 直接當成 MAC,公開 digest 可能讓攻擊者在不知道 secret 的情況下計算某些延伸訊息的合法 digest,這就是 length-extension attack。這種用途應改用經過分析的 HMAC,或直接採用標準的 authenticated scheme;單純把 secret 換個位置並不能解決問題。
Length extension 不代表 SHA-256 已被破解。它是某種錯誤組合方式的弱點;正常檔案雜湊、標準數位簽章與 HMAC 的安全判斷不能混在一起。SHA-384 與 SHA-512/256 沒有輸出完整的 SHA-512 家族內部狀態,因此針對 SHA-256 的標準 length-extension 手法不能直接套用;SHA-3 的 sponge 結構又是另一條路。這些差異留到 Part 2 再拆解,需要訊息認證時仍應使用 HMAC。[1][5]
6. 從 MD2、MD4、MD5 到 SHA:演算法也有生命週期
MD2、MD4、MD5 都出自 Ronald Rivest 的 message-digest 系列,而且各有公開規格。MD5 在 1990 年代非常普及,但後來的碰撞攻擊愈來愈實用。IETF 已明確指出,當應用需要碰撞抗性,例如數位簽章時,不應再使用 MD5。[6]
圖中把 MD 家族與 SHA-1 放在同一條時間軸,是為了呈現迭代式雜湊演算法的演進。SHA-1 並不屬於 Rivest 的 MD 家族;它由美國標準體系發布,輸出 160 bits。SHA-1 和 MD5 都使用相近年代常見的迭代設計思路,但標準、演算法與輸出長度不同。
這段歷史對產品設計的提醒很直接:演算法名稱應可替換,資料格式應保留 algorithm identifier,ROM 與硬體 accelerator 也要預留升級路徑。把某一套 SHA 燒死在不可修改的邏輯裡,往往比今天多省一點面積更危險。
7. SHAttered:SHA-1 的碰撞從論文走進現實
2017 年,Google Research 與 CWI Amsterdam 公布 SHAttered:研究團隊主動製作兩份不同的 PDF,讓它們得到完全相同的 SHA-1 digest。這是完整 SHA-1 的實際碰撞,直接擊中 collision resistance;它不等同於反推原文或破解原像抗性。[4]
這項成果直接威脅依賴碰撞抗性的簽章流程。許多系統簽署的是文件 digest;一旦兩份不同文件可以共用同一摘要,簽章就可能被挪到另一份內容上。若系統仍把碰撞已失守的 digest 當成文件唯一代表,攻擊者便可能利用簽章或驗證流程混淆兩者。
新系統不應再用 SHA-1 提供密碼保護。NIST 正在把 SHA-1 從所有密碼用途撤出,規劃於 2030 年底前完成轉換。舊檔案、舊憑證或既有資料仍可能需要 SHA-1 才能辨識,但這只屬於相容性處理,不能成為新信任機制的基礎。[3]
硬體尤其要注意 crypto agility。演算法若完全固化在 mask ROM 或固定 datapath,系統升級成本可能變成換晶片。至少應預留版本欄位、可更新韌體、可切換 hash engine,或在信任鏈裡支援新的簽章與雜湊套件。
8. SHA 的五大應用:同一個 digest,不同的信任條件
檔案完整性檢查最簡單:重新計算下載檔案的 digest,和可信來源提供的值比較。值相同表示資料在目前雜湊假設下沒有被改動,但不自動證明發布者身分。
數位簽章通常先對訊息做雜湊,再由私鑰對標準規定的編碼結果簽章。接收端用公鑰驗證。來源認證由私鑰、公鑰、憑證及簽章方案共同提供;SHA 的工作是產生固定長度的訊息代表。不能把「digest 相同」直接說成「簽章有效」。
密碼儲存不能只做 SHA-256(password + salt) 就收工。Salt 能避免相同密碼得到相同紀錄,也能打散預先計算表,但 raw SHA-256 太快。密碼資料庫應採用專門的 password hashing/KDF,例如 Argon2id,並設定合適的記憶體、時間成本與平行度。[7]
HMAC把 secret key 與 hash function 放進經過分析的內外兩層結構,可驗證訊息完整性與持鑰者身分。不要自己發明 hash(key || message) 或 hash(message || key)。[5]
Merkle Tree把大量資料分塊雜湊,再逐層合併到 root hash。驗證單一區塊時,不必下載整棵樹,只要拿到沿途 sibling hashes 就能重建 root。Certificate Transparency、內容分發與大型儲存系統都常用這種 authenticated data structure。[8]
9. 從硬體角度看 SHA:Secure Boot、OTP、PUF 與 KDF
Secure Boot 的主線是「前一階段驗證下一階段,再交出控制權」。ROM 裡的 root of trust 先驗證 bootloader,bootloader 再驗證 firmware 或 OS。SHA 負責把待驗證映像縮成 digest;簽章驗證與可信公鑰才負責判斷映像是否由授權者發布。只比對一個可被攻擊者一起替換的 digest,不能建立來源信任。[9]
OTP/eFuse 與 PUF 扮演互補角色。OTP/eFuse 常保存 root public-key hash、生命週期狀態、反回滾版本、debug policy 等固定設定;PUF 則協助重建綁定晶片的根材料,再由 KDF 衍生不同用途的金鑰。PUF 不等於 OTP,也不一定直接保護 OTP 內容;是否用 PUF-derived key 保護 Secure Storage 或其他祕密狀態,要看產品架構。
工程師延伸:從 OTP/PUF 到 SHA engine 的實作邊界
OTP/eFuse 即使無法任意回寫,讀取路徑、sense margin、錯誤修正、存取控制、旁路與故障注入仍會影響安全。PUF 流程也要處理 enrollment、helper data、錯誤修正、環境變化與 key lifecycle,不能把一次量測直接當成可用金鑰。
硬體 SHA engine 最後仍回到 PPA 取捨:iterative 架構重複使用一輪邏輯,面積較小但 latency 較高;unrolled 或 pipelined 架構吞吐量高,面積與切換功耗也增加。若產品同時支援 SHA-256、SHA-384、SHA-512、HMAC 與 KDF,資料寬度、排程記憶體、key path 和 side-channel 邊界都要一起規劃。
10. Part 1 總整理:把 SHA 放回正確位置
Part 1 可以整理成六個重點:
- SHA 是雜湊,不是加密;digest 沒有解密回原文的操作。
- 輸入可以很長,輸出長度由演算法決定;SHA-256 固定輸出 256 bits。
- 原像、第二原像、碰撞是三種不同攻擊模型;碰撞的通用界線約為
2^(n/2)。 - SHA-1 的碰撞抗性已失守,新系統應使用符合需求的 SHA-2、SHA-3 或其他標準方案。
- SHA 能支援完整性、簽章、HMAC、KDF 與 Merkle Tree,但每個應用都有自己的 key、salt、signature、root of trust 與協定條件。
- 硬體設計不能只看今天跑得動,還要預留演算法替換、金鑰生命週期、反回滾與失敗復原。
Part 2 將拆解 SHA-256/SHA-512 的 round、message schedule 與硬體架構,並比較 SHA-3 的 Keccak sponge 和 Merkle–Damgård 結構。
References
- NIST FIPS 180-4, Secure Hash Standard:SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 與截短版本的標準規格;可核對 padding、message schedule、block size 與 digest length。
- NIST SP 800-107 Rev. 1, Recommendation for Applications Using Approved Hash Algorithms:整理原像、第二原像、碰撞安全強度,以及雜湊在數位簽章、HMAC 與 KDF 裡的使用原則。NIST 已公告未來會將內容移轉到其他指引,本文採用其中仍適合解釋攻擊模型的部分。
- NIST, Transitioning Away from SHA-1 for All Applications:NIST 對 SHA-1 全面退場的官方時程與背景。
- SHAttered: The first collision for full SHA-1:2017 年 Google Research 與 CWI Amsterdam 公布的 SHA-1 實用碰撞專案,頁面保留兩份碰撞 PDF 與研究資料。
- RFC 2104, HMAC: Keyed-Hashing for Message Authentication:HMAC 的標準結構、金鑰處理與安全設計背景。
- RFC 6151, Updated Security Considerations for MD5 and HMAC-MD5:說明 MD5 在需要碰撞抗性的應用中已不可接受,並區分 MD5 與 HMAC-MD5 的安全情境。
- RFC 9106, Argon2 Memory-Hard Function:密碼雜湊與 proof-of-work 使用的 Argon2 規格;可對照 raw SHA 與專用 password hashing 的差異。
- RFC 9162, Certificate Transparency Version 2.0:包含 Merkle Tree、inclusion proof 與 consistency proof 的正式定義與應用範例。
- NIST SP 800-193, Platform Firmware Resiliency Guidelines:說明平台韌體的保護、偵測、復原、authenticated update 與硬體信任根。
學習指南
硬體安全入門
先備知識
- 二進位資料與基本資安名詞
我學會了什麼
- 區分雜湊與加密
- 比較原像、第二原像與碰撞抗性
- 把 SHA 放回 HMAC、簽章與 Secure Boot 的正確位置