סיסמה חד-פעמית


בקריפטוגרפיה ובאבטחת מידע, סיסמה חד-פעמית, או בקיצור OTP (One-Time Password), היא סיסמה שמשתמשים בה לצורך אימות אחד בלבד ולאחר מכן משמידים אותה. בגלל השימוש החד-פעמי, מערכת כזו מספקת מה שקרוי "אימות חזק" והיא עמידה בפני התקפת שידור חוזר (replay attack). מצותת פסיבי שמאזין לרשת התקשורת, מיירט סיסמאות ומנסה להשתמש בהן מאוחר יותר כדי להתחזות למישהו אחר, לא יוכל לעשות זאת כי הסיסמאות אינן בתוקף מיד לאחר השימוש הראשוני בהן.

ישנן כמה דרכים לניהול מערכת סיסמה חד-פעמית. דרך אחת היא שהשרת והלקוח מחזיקים ברשימת סיסמאות זהה ובכל פעם שהלקוח צריך לאמת את זהותו מול השרת הוא משתמש בסיסמה הבאה ברשימה, מסמן אותה לאחר השימוש בה ואינו חוזר להשתמש בה שוב. כאשר הרשימה מנוצלת עד תומה, מכינים רשימה חדשה ומתחילים מהתחלה. דרך אחרת היא לייצר את הסיסמה החד-פעמית באופן רקורסיבי מתוך סיסמה ראשונית המשותפת לשרת והלקוח עם פונקציה חד-כיוונית בטוחה כמו פונקציית גיבוב. כדי לייצר את רשימת הסיסמאות אפשר להפעיל מחולל פסאודו-אקראי. היתרון בזה שהסיסמאות הן בלתי תלויות הדדית. מערכת כזו כוללת בדרך כלל אלגוריתם להכנת סיסמאות ומנגנון לתיאום בין השרת והלקוח המסתמך על מונה כלשהו שמנוהל במקביל או חותם זמן כדי למנוע שימוש חוזר. חותם הזמן גם מקל על האילוץ של שימוש מידי בסיסמה. כאשר חותם הזמן מאפשר חלון זמנים לניצול יחיד, או למספר ניצולים, עד התפוגה, הכינוי הוא TOTP (Time based One-Time Password).

==רקע==
שיטת אימות באמצעות סיסמה קבועה מספקת הגנה חלשה מאוד מפני התחזות. זאת מכמה סיבות: ראשית, משתמשים נוטים בדרך כלל לבחור סיסמאות קלות לניחוש, מה שמקל מאוד על האקרים לבצע התקפת מילון למשל, ברשימת הסיסמאות הגרועות ביותר לשנת 2015 עדיין מככבת במקום הראשון הסיסמה "123456". שנית, במהלך האימות המשתמש חייב לשדר את הסיסמה (או את ערך הגיבוב שלה) במצב קריא, כך שהיא חשופה לציתות, מה שמסייע להאקרים לבצע מה שנקרא "התקפת שידור חוזר" (replay attack). בהתקפה כזו המתקיף פשוט מקליט את הסיסמה ששודרה באמצעות רחרחן ומשתמש בה מאוחר יותר כדי להתחזות לבעל הסיסמה.

קיימות דרכים להתמודד עם הבעיות שהוזכרו. למשל, שרתים בדרך כלל מנסים לאכוף "כללי סיסמה" על מנת למנוע ממשתמש לבחור סיסמה חלשה, וכן דורשים פרט מידע נוסף כגון כתובת דואר אלקטרוני וכדומה, מה שקרוי אימות דו-שלבי או אימות רב-שלבי (MFA). או מעבר לאימות חזק יותר באמצעות פרוטוקול אתגר מענה. סיסמה חד-פעמית הוצעה לראשונה על ידי לזלי למפורט ב-1981 והיא טובה משיטת סיסמה קבועה אך חלשה יותר לעומת פרוטוקול אתגר מענה.

מכשיר אימות SecureID של חברת RSA
כיום, שרתים נוטים לעבור לשיטות אימות חזקות יותר שהן גרסאות של פרוטוקול אתגר מענה (בדומה לשיטת האימות של GSM) או סיסמה חד-פעמית כמו S/KEY. משנת 2011 הציעה גוגל ללקוחותיה להשתמש בטכנולוגית אימות דו-שלבי עם אפליקציה הנקראת מאמת גוגל (Google Authenticator) המשתמשת בסיסמה חד-פעמית. מיקרוסופט מציעה שירות דומה Microsoft Authenticator הכולל אימות דו שלבי עם אפשרות להתקנת אפליקציה המכילה קוד אימות חד-פעמי.

חברות רבות מייצרות טכנולוגיות אימות המבוססות על סיסמה חד-פעמית כמו חברת HID או חברת RSA. הטכנולוגיות מתחלקות לשני סוגים עיקריים, בקרת גישה פיזית ובקרת גישה לוגית. בקרת גישה פיזית היא בדרך כלל מכשיר אלקטרוני קטן (חסין מגע) שנקרא אסימון אבטחה (Security token) המייצר קוד אימות חד-פעמי כמתואר בתרשים משמאל. בקרת גישה לוגית מבצעת פעולה דומה אך בתוכנה או אפליקציה, ההבחנה אינה מדויקת כי גם מכשיר אימות נשלט בדרך כלל באמצעות תוכנה.

==וריאציות של פרוטוקול סיסמה חד-פעמית==
ניהול פרוטוקול סיסמה חד-פעמית (OTP) אפשרי בכמה צורות:
# רשימה מודפסת של סיסמאות חד פעמיותרשימה משותפת. השרת והלקוח מחזיקים ברשימה תואמת של סיסמאות חד-פעמיות וכן מחזיקים במונה משותף, הסיסמאות מנוצלות באופן סדרתי והמונה מקודם לאחר כל אימות. 
# סיסמה חד-פעמית מוצפנת. תחילה השרת והלקוח משתפים ביניהם סיסמה ראשונית ואז בכל אימות הלקוח שולח לשרת סיסמה חדשה כשהיא מוצפנת באמצעות צופן סימטרי כלשהו כאשר את מפתח ההצפנה הוא מפיק מהסיסמה הקודמת.
# סיסמה מבוססת פונקציה חד-כיוונית. השיטה שהוצעה על ידי למפורט בה השרת והלקוח מתחילים מסיסמה ראשונית ואז בכל אימות הלקוח והשרת מייצרים במקביל את הסיסמה הבאה על ידי פונקציה חד-כיוונית זהה. הפונקציה החד-כיוונית יכולה להיות פונקציית גיבוב.
# סיסמה חד-פעמית מבוססת מחולל אקראי. פרוטוקול OTWP הוא רשימה של סיסמאות חד-פעמיות בלתי תלויות, המופקת מגרעין התחלתי סודי המשותף לשרת והלקוח. את הסיסמאות מייצרים על ידי מחולל פסאודו אקראי בטוח ואת הרשימה אפשר להדפיס במדפסת או לאחסן בקובץ.

==חתימה חד-פעמית של למפורט==
הלקוח והשרת מתחילים עם סוד משותף <math>w</math> הידוע רק להם וכן פונקציה חד-כיוונית (OWF) המסומנת <math>H</math> המשמשת להכנת רקורסיבית של הסדרה <math>w, H(w), H(H(w)),...,H^t(w)</math>. כך הסיסמה ה-<math>i</math> מוגדרת על ידי <math>w_i=H^{t-i}(w)</math> כאשר <math>t</math> הוא קבוע המגודר מראש המייצג את מספר הסיסמאות המקסימלי שמותר לייצר מסיסמה אחת. כאשר מגיעים ל-<math>t</math> סיסמאות מתחילים עם סוד משותף חדש.

הפרוטוקול פועל כדלהלן:
# הכנה. 
## תחילה הלקוח בוחר סוד אקראי <math>w</math>.
## בוחר קבוע <math>t</math> כלשהו כגון <math>t=1000</math>.
## בוחר מונה <math>i=1</math>.
## שולח לשרת באופן בטוח את הסוד המשותף <math>w_0=H(w)</math>.
## משמיד את <math>w</math>.
## כאשר השרת מקבל את <math>w_0</math> השרת מאתחל מונה מקומי <math>j=1</math> ושומר במסד הנתונים ברשומה המתאימה ללקוח הזה את <math>w_0</math> יחד עם <math>j</math>.
# צד לקוח. בכל בקשת אימות מתבצעים המהלכים הבאים:
## הלקוח שולח לשרת את <math>i</math>.
## וכן שולח את <math>w_i=H^{t-i}(w)</math>.
## הלקוח מקדם את המונה <math>i=i+1</math>.
# צד שרת. בכל אימות מתבצעים המהלכים הבאים:
## השרת מוודא תחילה ש-<math>i=j</math> אם לא הוא דוחה את בקשת ההתחברות. 
## מוודא שמתקיים <math>H(w_i)=w_{i-1}</math>. אם כן הוא מקבל את זהות הלקוח.
## השרת מקדם את המונה: <math>j=j+1</math>.

צריך לזכור שסיסמה חד-פעמית אינה בטוחה לגמרי מסיבה שעדיין קיים חשש שהאקר יצליח לפרוץ למערכת ולגנוב סיסמאות חד-פעמיות שטרם השתמשו בהן. אם מניחים שניתן לאחסן סיסמאות מוצפנות בצד השרת אפשר לבצע אלטרנטיבה כזו: השרת והלקוח מתחילים בסוד משותף <math>P</math> ובכל בקשת אימות הלקוח תחילה בוחר מספר חד-פעמי <math>r</math> ושולח לשרת את <math>r</math> ואת <math>H(r \ \| \ P)</math>. השרת מוודא את זהות הלקוח על ידי חישוב הפונקציה <math>H</math> של עותק הסיסמה הסודית <math>P</math> השמור אצלו יחד עם <math>r</math> ומשווה את תוצאות הגיבוב לעומת מה שקיבל. כדי למנוע התקפת שידור חוזר רצוי ש-<math>r</math> יהיה חד פעמי לדוגמה מספר סידורי או חותם זמן. החסרון העיקרי של סיסמת למפורט הוא שכל סיסמה תלויה בסיסמה קודמת. מסיבה זו אם המתקיף יצליח לנחש סיסמה אחת, כל הסיסמאות הבאות אחריה אינן בטוחות לשימוש.

== אבטחה ==
בדומה לסיסמאות רגילות, גם סיסמאות חד פעמיות פגיעות להתקפות הנדסה חברתית שבהן משתמשים בדיוג כגי לגנוב סיסמאות רגילות או חד פעמיות. כמו כן, כמו סיסמאות רגילות, גם סיסמאות חד פעמיות פגיעות להתקפות man-in-the-middle, ולכן חשוב מאד לתקשר אותן באמצעות ערוץ תקשורת מאובטח.

סיסמאות חד פעמיות שלא משתמשות בסנכרון זמן או רכיב תגובה לאתגר, כמו למשל רשימות מודפסות של סיסמאות חד פעמיות, יהיו בהכרח פגיעות לאורך תקופה ארוכה. מתקפת דיוג כזו בוצעה בסוף שנת 2005 על לקוחות של בנק אינטרנט שוודי. הלקוחות קיבלו אימייל ובו נדרשו לספק לאתר התוקף את פרטי חשבון הבנק שלהם ואת הסיסמה החד פעמית הבאה ברשימת הסיסמאות החד פעמיות הפרטית שלהם. <ref></ref>

העובדה ששני סוגי הסיסמאות פגיעים להתקפות דומות הייתה מניע מרכזי בפיתוח אימות רב שלבי שנועד להיות עמיד יותר בפני התקפות דיוג.

==תקנים==
בגלל שטכנולוגיות סיסמה חד-פעמית רבות מוגנות בפטנטים קשה למצוא תקנים בתחום זה. בכל זאת קיימים מספר תקנים ידועים ביניהם:
* S/KEY
* OTP
* HOTP המבוססת על קוד אימות מסרים HMAC.
* TOTP, הרחבה של HOTP המבוססת על HMAC וכוללת חותם זמן.

==ראו גם==
*סיסמה

==הערות שוליים==

קטגוריה:הצפנה
קטגוריה:אבטחת מידע