什麼是碰撞攻擊 (Collision Attack)? 在**雜湊函數(Hash Function)**中, 輸入(message)可能有無限多種。 輸出(digest)固定長度(例如 SHA-256 輸出 256 bits)。 **碰撞(Collision)**就是: 找到兩個不同的輸入 m1 ≠ m2,但它們的雜湊值一樣: Hash(m1)=Hash(m2) 碰撞攻擊就是攻擊者刻意找出這樣的 m1 與 m2,利用這點來偽造資料或簽章。 碰撞攻擊的種類: 1. 一般碰撞攻擊(Collision Attack) 攻擊者只要找到 任意兩個不同輸入 產生相同的 Hash 即可。 所需複雜度 ≈ 2^n/2(生日悖論,n = 輸出位數)。 例如:對 128-bit 的 MD5,只需要大約 2^64 嘗試。 2. 第二原像攻擊(Second Preimage Attack) 給定一個輸入 m1,攻擊者要找到另一個 m2,使得 Hash(m1)=Hash(m2) 比一般碰撞更困難。 3. 原像攻擊(Preimage Attack) 已知一個 Hash 值 H,攻擊者要找到任意一個 m 使得 Hash(m)=H 最困難,複雜度 ≈ 2^n ⚡ 實際案例 MD5:早在 2004 年就能有效產生碰撞,已完全不安全。 SHA-1:2017 年 Google 公布 "SHAttered" 攻擊,成功生成兩個不同的 PDF,但 Hash 值一樣。 SHA-2、SHA-3:目前仍無已知有效碰撞攻擊,被認為安全。 風險 攻擊者可以偽造數位簽章: 例如準備兩份文件(合約 A、合約 B),讓它們的 Hash 值相同。若簽署 A,攻擊者可用 B 取代而不被偵測。 ✅ 防範方式 1.不要再使用 MD5、SHA-1。 2.建議改用 SHA-256、SHA-512 或 SHA-3。 3.在簽章與驗證系統中,避免只依賴雜湊值,可加入隨機鹽(salt)。