首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript MD5 加密:空字串導致雜湊值改變之謎

     編輯:程式設計綜合問答

現象

爬蟲模擬登入時發現:md5(h1) 與 md5(h1 + salt) 結果不同,但 salt = ""(空字串)。按理空字串不應影響 MD5 結果。

真相揭露

瀏覽器開發者工具顯示 salt = "",實際上 salt 是一個 長度為 8 的不可見控制字元/亂碼字串。控制台無法顯示這些字元,誤以為是空字串。

驗證方法

console.log(salt.length);        // 輸出 8,非 0
console.log(salt.charCodeAt(0)); // 查看第一個字元編碼
console.log(JSON.stringify(salt)); // 可見轉義序列,如 "\u0001\u0002..."

Python 複現

import hashlib
h1 = "g\x8fn\xb7\xbfEA{3\xa9\xe4I\x84\xc7\x8f"  # 實際位元組
salt = "\x01\x02\x03\x04\x05\x06\x07\x08"       // 8 位元組亂碼

print(hashlib.md5(h1.encode('latin-1')).hexdigest())
print(hashlib.md5((h1 + salt).encode('latin-1')).hexdigest()) # 結果不同

關鍵點

  • JS 字串是 UTF-16 代碼單元序列,「空字串」長度為 0;若長度非 0,必含字元。
  • MD5 輸入為位元組序列,不同位元組序列產生不同雜湊,與語言無關。
  • 瀏覽器控制台顯示不可靠,務必用 .length、charCodeAt、JSON.stringify 檢查實際內容。

爬蟲建議

  1. 在 Network 面板捕獲實際發送的請求參數(已編碼)。
  2. 用 JS 執行相同加密邏輯(在 Console 或 Puppeteer 中),直接取得結果,避免跨語言重現加密細節。
  3. 若必須用 Python,確保字串編碼一致(通常用 `latin-1` 或 `iso-8859-1` 保持位元組不變)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved