一句話:HMAC 是「拿一把 secret key、對一段訊息算出的一段指紋」。同一把 key、同一段訊息,兩邊各自算會得到同一指紋——所以能證明「訊息確實出自握有這把 key 的人、而且沒被改過」。
hash 是把任意長度的資料,壓成一段固定長度的「指紋」。兩個關鍵特性:
最常見的雜湊演算法是 SHA-256(輸出 256 bit)。
問題在於——任何人拿到訊息都能算出它的 hash,所以光靠 hash 無法證明「這是我算的、不是別人偽造的」。
HMAC 在算 hash 時,摻進一把只有你和 server 知道的 secret key。於是:
比喻:hash 像「把文件縮成一張特徵摘要」,誰都能印。HMAC 像「先蓋一顆只有你有的私章、再縮成摘要」——別人看得到摘要卻仿不出那顆章;收件方也有同一顆章,重蓋一次比對,就知道是不是你、內容有沒有被動過。
HMAC 的規格出自 RFC 2104:它可搭配任何雜湊函數(如 SHA-256),配一把 secret key,用於「訊息認證」——確認訊息的來源與完整性。寫法常記為 HMAC-SHA256(key, message)。
pre-signed URL 網址尾巴那段 X-Amz-Signature,骨子裡就是一連串 HMAC-SHA256 算出來的(Level 3 會整個拆開)。現在只要記住這句:有 key 才算得出、兩邊算一次就能對、改一個字就對不上——這正是「為什麼改動 URL 任一字元、簽章就立刻失效」的根源。