מחולל HMAC
חתימה על הודעה באמצעות מפתח סודי. דבר אינו נשלח.
- פועל בדפדפן שלך — הטקסט שלך לא נשלח לשום מקום
- בלי הרשמה, בלי מכסות, חינם לשימוש בלי הגבלה
איך זה עובד
HMAC מוכיח שני דברים בו-זמנית: שההודעה לא שונתה, ושמי שיצר אותו מחזיק בסוד המשותף. זה מה שחותם על webhooks, בקשות API וקישורי הורדה ברוב האינטרנט.
שונה מגיבוב רגיל, בדרך החשובה
כל אחד יכול לחשב SHA-256 של הודעה, ולכן גיבוב חשוף אינו מוכיח דבר על מי יצר אותו: משנים את ההודעה, מחשבים מחדש את הגיבוב, ואיש אינו יכול לדעת. HMAC משלב מפתח סודי בחישוב, ולכן אי אפשר לחשב אותו מחדש בלי המפתח. זו המטרה כולה, ולכן חתימות webhook משתמשות ב-HMAC ולא בגיבוב.
אימות בטוח
כשבודקים HMAC בשרת, יש להשוות אותו בפונקציה של זמן קבוע: crypto.timingSafeEqual ב-Node, hash_equals ב-PHP. האופרטור הרגיל == מחזיר תשובה ברגע ששני בתים נבדלים, והזמן שהוא לוקח מדליף כמה מהחתימה היה נכון, וזה מספיק כדי לזייף חתימה בעזרת סבלנות. זו התקפה אמיתית ולא תיאורטית.
איזה אלגוריתם
SHA-256, אלא אם נקבע אחרת. SHA-1 כלול משום שהרבה ממשקי API ישנים עדיין דורשים HMAC-SHA-1, ו-HMAC-SHA-1 לא נשבר כפי ש-SHA-1 רגיל נשבר, אך אין סיבה לבחור בו עבור דבר חדש.
Hex או Base64
תלוי אך ורק במה שהצד השני מצפה לו. Hex ארוך פי שניים וקל יותר לקריאה; Base64 קומפקטי יותר ונפוץ בכותרות HTTP. אותה חתימה מוצגת בשניהם.
המפתח נשאר כאן
נוצר באמצעות Web Crypto API של הדפדפן עצמו. המפתח וההודעה לא נשלחים לשום מקום, וזו הדרך האחראית היחידה להציע כלי כזה: כלי חתימה שמעלה את הסוד מוסר את מה שהסוד אמור להגן עליו.
מחולל HMAC — שאלות
במה HMAC שונה מגיבוב?
כל אחד יכול לחשב מחדש גיבוב. HMAC דורש את המפתח הסודי, ולכן הוא מוכיח מי יצר אותו.
באיזה אלגוריתם להשתמש?
SHA-256, אלא אם ממשק API מציין אחרת. SHA-1 מוצע עבור מערכות ישנות שעדיין דורשות אותו.
במה לבחור, hex או Base64?
במה שהצד השני מצפה לו. שניהם מוצגים עבור אותה חתימה.
למה ההשוואה חייבת להיות בזמן קבוע?
השוואה רגילה מסתיימת מוקדם בחוסר ההתאמה הראשון, והפרש הזמנים מדליף כמה מהחתימה היה נכון, וזה מספיק כדי לזייף חתימה.
האם המפתח הסודי נשלח לאנשהו?
לא. הכול רץ בדפדפן באמצעות Web Crypto API.