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
- อย่าลืมหมุนคีย์และจำกัดสิทธิ์ที่เก็บคีย์