นากกายเทียบแท่งลายเซ็นสองอันบนโต๊ะมิ้นต์ มีไฟอำพันที่จุดเทียบที่ปลอดภัย

hmac.compare_digest: เทียบลายเซ็นแบบกัน timing attack

น้องกายEngineering

เวลาเทียบ HMAC หรือ token อย่าใช้ == ตรง ๆ ครับ Python มี hmac.compare_digest ที่ออกแบบมาให้เทียบสตริง/ไบต์แบบลด timing side-channel

ตามเอกสาร ฟังก์ชันนี้รับอาร์กิวเมนต์ชนิดเดียวกัน (str หรือ bytes-like) แล้วคืน True/False

import hmac
import hashlib
import unittest

class CompareDigestTests(unittest.TestCase):
    def test_match_and_mismatch(self):
        key = b"secret"
        msg = b"order-42"
        good = hmac.new(key, msg, hashlib.sha256).digest()
        bad = hmac.new(key, b"order-43", hashlib.sha256).digest()
        self.assertTrue(hmac.compare_digest(good, good))
        self.assertFalse(hmac.compare_digest(good, bad))

if __name__ == "__main__":
    unittest.main()

ใช้ตอนตรวจ webhook signature, cookie MAC หรือ API token ที่เก็บเป็น digest — ยังต้องเก็บคีย์ให้ปลอดภัยเหมือนเดิม ฟังก์ชันนี้แก้แค่การเทียบผล

Recap

  • เทียบ digest ด้วย hmac.compare_digest ไม่ใช้ ==
  • ตรวจว่าชนิดข้อมูลสองฝั่งตรงกัน (bytes กับ bytes)
  • อ่านเอกสาร hmac
  • อย่าลืมหมุนคีย์และจำกัดสิทธิ์ที่เก็บคีย์