- הבדל הקלט הבסיסי: HOTP מחשב גיבוב (Hash) מתוך מונה C שגדל מונוטונית, בעוד ש-TOTP מחליף את C ב-צעד זמן מבוסס Epoch T (CurrentUnixTime / 30).
- ירושה ישירה: מבחינה מתמטית, TOTP הוא מקרה פרטי של HOTP:
TOTP(K, Time) = HOTP(K, T). שני האלגוריתמים משתמשים באותה פונקציית Dynamic Truncation בדיוק. - הגורם המכריע בארכיטקטורה: HOTP הוא בעל מצב (stateful - שרתים חייבים לנעול ולשמור מונים למסד הנתונים בכל אימות). TOTP הוא חסר מצב (stateless), מה שמאפשר למיקרו-שירותי ענן מודרניים לאמת טוקנים על פני אשכולות מבוזרים עם חלוקת עומסים ללא פעולות כתיבה למסד נתונים מרכזי.
שורשים היסטוריים: מטוקנים פיזיים קנייניים לתקני רשת פתוחים
בראשית שנות ה-2000, שוק האימות הדו-שלבי בארגונים נשלט ברובו על ידי טוקנים פיזיים קנייניים כדוגמת RSA SecurID. מכשירים סגורים ויקרים אלה הכילו גבישי קוורץ פנימיים שסונכרנו מול שרתי ארגון ייעודיים. כאשר ארגון רצה לספק אבטחת ריבוי-גורמים לאלפי עובדים, עלויות הרכש של החומרה ודמי הרישוי הקנייניים היו אסטרונומיים.
כדי לשחרר את עולם האימות מחברות קנייניות, הוקם קונסורציום OATH (Initiative for Open Authentication) על ידי מובילי תעשייה במטרה לספק תקני IETF פתוחים וללא תמלוגים, שכל מהנדס תוכנה יוכל לבחון, ליישם ולבקר באופן חופשי:
אלגוריתם סיסמה חד-פעמית מבוסס HMAC (HMAC-Based One-Time Password Algorithm). הותאם למיקרו-בקרים בעלי צריכת חשמל נמוכה עם כפתור לחיצה פיזי. לחיצה על הכפתור מקדמת מונה פנימי ומציגה קוד בן 6 ספרות על גבי מסך LCD.
אלגוריתם סיסמה חד-פעמית מבוסס זמן (Time-Based One-Time Password Algorithm). תוכנן עם העלייה המהירה באימוץ הסמארטפונים. על ידי מינוף סנכרון זמן רשתי (NTP) סלולרי, TOTP ביטל לחלוטין אי-התאמות במצב המונה עקב לחיצות על כפתורים פיזיים.
ארכיטקטורת HOTP (RFC 4226) ומכניקת הבייטים של Dynamic Truncation
ההגדרה המתמטית של HOTP היא תמציתית להפליא:
פירוט הפרמטרים:
K: מפתח סודי סימטרי משותף (בדרך כלל רצף בינארי מפוענח מ-Base32 של 160 ביט / 20 בייטים).C: מונה מספר שלם של 8 בייטים (64 ביט) בפורמט Big-Endian.HMAC-SHA-1: קוד אימות הודעות באמצעות פונקציית גיבוב המייצר תמצית קריפטוגרפית בת 20 בייטים (160 ביט).
🔍 כיצד קיטום דינמי (Dynamic Truncation - DT) ממיר 20 בייטים ל-6 ספרות:
תמצית HMAC-SHA1 מכילה 160 ביט (20 בייטים). חילוץ של 6 ספרות עשרוניות אחידות דורש מנגנון בחירה דטרמיניסטי ועמיד בפני התנגשויות המוגדר בסעיף 5.3 של RFC 4226:
נניח שהמפתח הסודי ב-ASCII הוא "12345678901234567890" והמונה הוא C = 0. תמצית ה-HMAC-SHA1 המתקבלת בהקסדצימל היא:
1. הבייט האחרון הוא 0x71. מתקיים 0x71 & 0x0F = 0x01, ולכן Offset = 1.
2. בייטים 1 עד 4 הם: 93 cf 18 50. איפוס ה-MSB נותן 0x13cf1850, שערכו בעשרוני שווה ל-332,339,280.
3. 332339280 mod 1000000 = 339280. קוד ה-OTP בן 6 הספרות שמתקבל הוא 339280!
התפתחות TOTP (RFC 6238): קסם צעדי הזמן
HOTP דרש שמירה על סנכרון רציף של המונה בין הלקוח לשרת. במכשירי תוכנה, ספירת לחיצות מקשים או כפתורים יוצרת שגיאות אנוש מתמשכות.
RFC 6238 החליף את המונה C ב-צעד זמן בדיד T הנגזר ישירות משעון ה-Unix Epoch:
- CurrentUnixTime: מספר השניות שחלפו מאז 1970-01-01 00:00:00 UTC.
- T0: נקודת הייחוס לאתחול ה-Epoch (ברירת המחדל היא 0 בכל המערכות המודרניות).
- X (חלון צעד הזמן): משך הזמן הסטנדרטי המומלץ של 30 שניות.
- פונקציית רצפה ⌊ ⌋: עבור כל חותמת זמן בתוך חלון של 30 שניות, T נשאר קבוע לחלוטין. לדוגמה, בין שניות ה-Epoch 1728211200 ל-1728211229, הערך של T מחושב לאותו מספר שלם בן 64 ביט בדיוק.
סריאליזציה בינארית: לאחר חישוב T, הוא נארז למאגר בתים בינארי בן 8 בייטים בפורמט Big-Endian (זהה במבנה הזיכרון למונה C ב-HOTP). כתוצאה מכך, הנוסחה המאוחדת מתכנסת לפשטות אלגנטית:
TOTP(K, Time) = HOTP(K, T)
אלגנטיות מתמטית זו מסבירה מדוע אפליקציות אימות מחליפות קודים בסנכרון מושלם מדי 30 שניות, ללא צורך בשמירת מצב או בסנכרון נתונים מקוון.
HS[31] & 0x0F); ב-SHA-512 (תמצית של 64 בייטים), ההיסט נלקח מבייט 63 (HS[63] & 0x0F). עם זאת, ב-99.9% מאתרי האינטרנט המסחריים (Google, Microsoft, GitHub, AWS), SHA-1 נותר ברירת המחדל האוניברסלית בשל תאימות לאחור עם אפליקציות מובייל ישנות.
טבלת השוואה מקיפה: HOTP מול TOTP
| ממד | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| משתנה קלט | מונה אירועים C (גדל באופן מונוטוני) | צעד זמן T (חלון Unix Epoch של 30 שניות) |
| משך חיי הטוקן | ללא הגבלת זמן (תקף עד לשימוש בכניסה הבאה) | 30 שניות בלבד (פג תוקף אוטומטית) |
| ארכיטקטורת שרת | בעלת מצב (דרושות כתיבות אטומיות למסד נתונים בכל כניסה) | חסרת מצב (אימות עצמאי באמצעות שעון NTP) |
| חשיפה למתקפת שידור חוזר (Replay Attack) | בינונית (טוקן שיורט נותר תקף עד לשימוש בו) | מינימלית (מוגבל לשניות הנותרות בחלון הפעיל) |
| אופן כשל עיקרי | דה-סנכרון מונה (לחיצות אקראיות על כפתור) | סטיית שעון (Clock Drift בטלפון הלקוח) |
| פונקציות גיבוב קריפטוגרפיות נתמכות | HMAC-SHA-1 בלבד | HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512 |
| אימוץ בתעשייה | טוקנים בנקאיים ישנים, שערים פיזיים ייעודיים | 99.9% מאפליקציות האימות ברשת המודרנית |
פתרונות הנדסיים לדה-סנכרון וסטיית שעון
בסביבות ייצור מבוזרות, לקוחות ושרתים חווים בהכרח פערים בסנכרון. קריפטוגרפים תכננו חלונות פיצוי מפורשים לשמירה על אמינות תפעולית:
אם משתמש לוחץ על כפתור הטוקן שלו 5 פעמים מבלי לשלוח את הקוד, מונה הלקוח מגיע ל-C+5 בעוד שרת האימות נשאר ב-C.
תקן RFC 4226 קובע כי בעת האימות, השרת מחשב חלון מקדים המשתרע על פני [C+1, C+s] (בדרך כלל s=20). אם מזוהה התאמה, השרת מקדם את המונה C מיד ומסתנכרן מחדש.
עקב השהיות רשת או סטיית שעון במכשיר הלקוח (כגון שעון טלפון המפגר ב-10 שניות), טוקנים עשויים להגיע בצעדי זמן סמוכים.
שרתי ייצור בודקים מערך של 3 חלונות: [T-1, T, T+1], מה שמרחיב בפועל את חלון קבלת הקוד ל-90 שניות.
כאשר שרתים מוודאים האם הקוד שהזין המשתמש תואם לקוד שחושב, בדיקת שוויון מחרוזות נאיבית (כגון userOtp === serverOtp) עוצרת בתו הראשון שאינו תואם. תוקף המודד זמני תגובה רשתיים מיקרוסקופיים יכול לשחזר את הספרות בהדרגה. מערכות קצה ארגוניות אוכפות השוואת שוויון בזמן קבוע (למשל crypto.timingSafeEqual ב-Node.js) כדי לסכל ניתוח תזמון בערוץ צדדי.
מדוע TOTP כבש את האינטרנט המודרני
ניצחונו המכריע של TOTP על פני HOTP ברחבי הרשת הונע על ידי שלושה יתרונות ארכיטקטוניים מרכזיים:
במיקרו-שירותים מבוזרים הפרוסים במספר אזורים בעולם, כל מופע שרת בעל שעון מסונכרן NTP יכול לאמת קודי TOTP ללא צורך בשאילתות או נעילת רשומות במסד נתונים מרכזי.
סמארטפונים מכיילים באופן רציף את שעון המערכת שלהם דרך תחנות בסיס סלולריות ו-GPS, מה שמבטל בעיות סטיית שעון ללא צורך בתחזוקת חומרה ייעודית.
קודי HOTP נותרים תקפים ללא הגבלת זמן עד לשימוש בהם. לעומת זאת, קודי TOTP פוקעים תוך 30 שניות, ובכך מנטרלים אוטומטית סכנה מלוגים שנחשפו או מיירוט תעבורה פסיבי.
התנסו בחישובי TOTP בזמן אמת ב-2FA-Tool
ראו כיצד מחרוזת ה-Base32 הסודית שלכם הופכת לקודים דינמיים של 6 ספרות באמצעות Dynamic Truncation של HMAC-SHA1. 100% לא מקוון בדפדפן שלכם.
📚 מדריכי אבטחה קשורים
כיצד להעביר חשבונות 2FA בין סמארטפונים באמצעות קודי QR לא מקוונים וסנכרון ענן.
כללי תאימות, שמירת קודי שחזור, שילוב מפתחות SSH ותהליכי שחזור חשבון.
כיצד לשחזר גישה לחשבונות Google, Microsoft, Steam, Binance, Apple ו-Discord.