所謂"MD5解密",其實是查表
你可能用過這類工具——把一串 MD5 值粘進去,點解密,出來一個明文。感覺很神奇。
但 MD5 是單向哈希,理論上不可逆,這些工具是怎麼做到的?
答案很簡單:它們根本沒有解密,就是查數據庫。
背後的數據庫存着幾十億條"原文 → 哈希"的對應關係,你輸入一個哈希值,它在庫裏找有沒有匹配的原文,找到就返回給你,找不到就顯示失敗。這個數據庫就叫彩虹表,或者更直白地叫哈希字典。
所以工具頁上"解密"這個詞其實是個不太準確的說法,更準確的叫法是"哈希逆查"或者"碰撞查詢"。
彩虹表裏有什麼?
主要是這幾類:
常見密碼。123456、password、qwerty、admin……這些密碼有幾十億人在用,早就被計算好存進去了。5f4dcc3b5aa765d61d8327deb882cf99 就是 password 的 MD5,隨便輸進任何一個在線查詢工具都能秒出結果。
短字符串。純數字6-8位、純小寫字母4-6位、手機號、生日(19901010這種格式)……這些排列組合數量有限,都可以提前算完。
以前泄露的真實密碼。歷史上發生過大量數據庫泄露事件,泄露出來的真實密碼被整理進字典,這些往往是命中率最高的一批。
爲什麼有些 MD5 查不到?
有幾種情況:
原文本身就很複雜。比如一個20位的隨機字符串,組合數量是天文數字,彩虹表根本裝不下。
加了鹽(Salt)。正確的密碼存儲方式是在哈希之前把密碼和一段隨機字符串拼在一起,比如把 password 變成 password$xK92mP` 再哈希,結果就完全不同了,彩虹表裏當然也找不到 `password$xK92mP 的哈希。
換了哈希算法。查詢工具的數據庫針對的是標準 MD5。如果系統裏用的是 bcrypt、Argon2 或者加了多輪迭代的方案,這些工具完全沒用。
這件事說明了什麼?
說明用 MD5 存密碼真的很危險,不是危言聳聽。
一旦數據庫被拖走,攻擊者不需要真正"破解"MD5——他們只需要把哈希值往彩虹表裏一查,大部分常見密碼幾秒內就出來了。2012年 LinkedIn 數據庫泄露,有研究人員在泄露的6百多萬個哈希裏,幾小時內就還原出了大部分原始密碼。當時用的就是這種查表方法,不是什麼高深技術。
如果你手上有個 MD5 哈希值需要查一下對應的原文,用 MD5 在線解密工具 試試就知道了——能查到說明原文很常見,查不到說明原文足夠複雜或者加了鹽,反而是好事。
開發者需要知道的
如果你在做用戶系統,密碼存儲這裏請注意:
不要存明文密碼,這個應該不用說。
不要只用 MD5,即使加鹽也不夠——MD5 計算太快,GPU 每秒能算幾十億次,加了鹽只是讓彩虹表失效,但暴力枚舉還是很快。
用專門爲密碼設計的哈希函數。bcrypt、Argon2、scrypt 這些算法故意設計得很慢,而且計算成本可以調節——你可以讓每次哈希花 200 毫秒,對正常用戶登錄毫無影響,但對攻擊者來說暴力破解的成本就高了幾個數量級。
密碼忘了就重置,別試圖還原。如果你係統裏有"找回密碼"功能,應該是發重置鏈接,不是把原始密碼發給用戶。能把原始密碼發給用戶,說明你根本沒有正確存儲密碼。
MD5 本身並不是完全沒用,用來校驗文件完整性、做緩存 key、生成內容 ID 這些場景都還好,只是別用來存密碼。



加載中...