تكرار السؤال: …
الإجابة المختصرة
هجمات تقيس وقت استجابة السيرفر بالنانوثانية لمعرفة كم حرفاً تطابق قبل الفشل؛ وتمنعها timingSafeEqual بمقارنة البايتات في زمن ثابت دائماً.
الشرح
عوامل المقارنة العادية مثل === تقارن النصوص حرفاً بحرف وتتوقف فور أول حرف مختلف (Short-circuiting). يتيح هذا للمهاجم إرسال مئات المحاولات وتخمين مفاتيح التشفير وتواقيع الـ Webhooks بدقة. دالة crypto.timingSafeEqual تقارن كائني Buffer في وقت زمني ثابت تماماً بغض النظر عن موقع أول تطابق أو اختلاف.
مثال بالكود
import crypto from "node:crypto";
const isMatch = crypto.timingSafeEqual(
Buffer.from(signatureA, "utf8"),
Buffer.from(signatureB, "utf8")
);أخطاء شائعة
- مقارنة تواقيع الـ Webhooks (مثل Stripe أو GitHub) باستخدام عامل المساواة العادي ===.