ססמאות ואנטרופיה

איך מודדים חוזק של ססמאות?
entropy

בין אם אנחנו משתמשים ובין אם אנחנו מתכנתים – כולנו מכירים את ההצקה הקבועה כאשר נרשמים לשירות. מחייבים אותנו לאורך מינימלי וכמובן לאותיות גדולות וסימנים מיוחדים. לא מעט שירותים בישראל וגם בעולם מחייבים אותנו להכניס תוים מיוחדים – כלומר % או # או ! בסיסמה ולא מאפשרים לנו להרשם בשירות אם אנחנו לא מכניסים לסיסמה שלנו תו אחד לפחות מסוג זה. המהדרין מחייבים אותנו לכלול לפחות ספרה אחת, תו מיוחד אחת ואות גדולה אחת באנגלית. מתכנתים הרבה פעמים עושים את זה באופן עיוור. אנחנו מממשים מנגנון ססמאות באתר? נחייב את המשתמשים שלנו לבחור ססמאות עם אות גדולה, מספר ותו מיוחד. זה כבר מגיע באופן אוטומטי.

נשאלת השאלה "למה?". במקרה הזה לא נדרש להיות מומחה גדול כדי להבין שזה מקטין את היכולת לנחש את הסיסמה. אבל בואו ונצא שניה מהאינטואיציה ונטעם מעט מהעולם המופלא של אבטחת המידע. בואו ונניח שיש לי סיסמה המורכבת מאות אחת בשפה האנגלית (למשל a או u). מהו מספר הניחושים המקסימלי שאותו אני צריך על מנת לנחש את הסיסמה? התשובה היא כמובן מספר האותיות בשפה האנגלית שעומד על 26. אם למשל בחרתי סיסמה וההאקר ירצה לפצח את הסיסמה, הוא יצטרך לנחש את האותיות אחת אחרי השניה. הוא ישאל אותי: "הסיסמה היא a?" במידה וכן, הצליח לו תוך ניסיון פיצוח אחד. אם בחרתי באות z כסיסמה שלי והוא יעבור על כל האותיות לפי הסר מ-a עד z אז מספר הניסיונות שלו יהיה 26. כלומר רמת הקושי של הסיסמה תהיה 26 ניסיונות.
בעולם התכנות מקובלת לייצג את הקושי של הסיסמה במונח 'אנטרופיה'. לוקחים את מספר הניסיונות האפשרי ומכניסים אותו (לא להתעלף מהמתמטיקה בבקשה) ללוגריתם של 26 בבסיס 2. זה נשמע מסובך, אבל קל לחשב את זה עם גוגל בלבד בלי להוציא מחשבון, פשוט חפשו

log2(26)

במנוע החיפוש של גוגל ותקבלו את התוצאה 4.7 – זו האנטרופיה של סיסמה עם ספרה אחת שמכילה אך ורק אות קטנה באנגלית. או יותר נכון אנטרופיה בביטים.
זה נשמע מסובך אבל זה ממש לא – כל מה שצריך לזכור זה (log(x כאשר בתוך ה-x אנחנו מכניסים את מספר האפשרויות.

לא שכנעתי שזה פשוט? בואו ונראה עם עוד דוגמה – אם נגדיר שהסיסמה התיאורטית שלנו תכיל גם אותיות גדולות, אז מה לפי דעתכם יקרה? טוב, סביר להניח שרמת הקושי תגדל. בכמה? עכשיו אנחנו לא צריכים 26 ניסיונות אלא 52 (26 אותיות גדולות ו-26 אותיות קטנות). כמה האנטרופיה תהיה עכשיו?

log2(52)

הנוסחה הזו מניבה את התוצאה 5.7. כלומר הסיסמה הזו היא בעלת חוזק של 5.7 ביטים של אנטרופיה. לא קשה, נכון? זה גם לא קשה גם אם אנחנו צריכים לחשב אנטרופיה של ססמאות שהן יותר מתו אחד. אם הסיסמה שלנו היא 6 תוים, אנחנו נצטרך לנחש 6 פעמים. האנטרופיה של הסיסמה הזו תהיה:

log2(52) X 6 = 34.2

34.2 זה מספר נחמד אבל אפשר להוציא ממנו גם את כמות הניסיונות המקסימלי שצריך בשביל לפצח את הססמה. כל מה שצריך זה להכניס אותו לחזקת 2. 2 בחזקת 34.2 זה יוצא (בערך): 19,770,609,663 – כלומר 19 מיליארד, שבע מאות שבעים מיליון ו-609 אלף ניסיונות מקסימליים. וואו! זה נשמע הרבה, נכון? אבל האמת היא שבחלק מהמקרים זה יקח מספר דקות בודדות לפרוץ את הסיסמה הזו. לא כל ההתקפות הן מבוססות רשת. בהנחה ויש לי קובץ מוגן בסיסמה שאני רוצה לפרוץ והוא נמצא על המחשב שלי או על מחשב שיש לי עליו שליטה והמחשב הוא מחשב חזק, אני יכול לנסות ולפצח את הסיסמה במיליון בקשות לשניה. כלומר תוך 5 וחצי שעות אני יכול, תיאורטית, לפצח את הסיסמה.

זו הסיבה העיקרית שבגללה מטריחים אותנו עם התוים המיוחדים. נחזור לתוים המיוחדים ולסיסמה בעלת התו האחד. אם נחייב את המשתמש להקליד לפחות אות גדולה אחת, אות קטנה אחת, ספרה ותו מיוחד – מספר האפשרויות שיש לתו אחד הוא: 26 אותיות קטנות באנגלית, 26 אותיות גדולות באנגלית, 10 ספרות ו-10 סימנים מיוחדים. בסך הכל 72 תוים. האנטרופיה היא 6.17. לסיסמה בת 6 תוים האנטרופיה תהיה 6.17 כפול מספר התוים. במקרה שלנו 37.019. ההבדל מסיסמה עם אותיות בלבד לא נראה כאן דרמטי, אבל מספר הניסיונות שאני אצטרך עכשיו הוא שתיים בחזקת 37.019: 139,314,069,508 – כלומר 139 מיליארד. שזה הרבה הרבה יותר. במחשב שיכול לנחש מיליון ניחושים לשניה מדובר בכ-38 שעות. לא רע!

אז כן, הוספת תוים מיוחדים מעלה את האבטחה. אבל זה בעייתי.

מה הבעיה עם זה? כמה בעיות – הראשונה היא שלמרות שהאנטרופיה גדלה, עדיין הוספת התוים המיוחדים לא הופכת את הסיסמה לבלתי פריצה. נכון, הפרש של 33 שעות הוא גדול, אבל הוא לא הופך את פיצוח הסיסמה לבלתי אפשרית.
הבעיה השניה היא שחוזק של 37 ביטים של אנטרופיה הוא מעולה, אבל לא מספיק טוב בעידן של מעבדים גרפיים חזקים. בעבר מיליון ניסיונות לשניה נשמעו כמו המון (וזה באמת המון), אבל היום מדברים על מיליארד ניסיונות לשניה. אז הוספת התוים המיוחדים לסיסמאות נראית מגוחכת. אנחנו צריכים לגרום לסיסמה שלנו להיות עם אנטרופיה ממש גבוהה בכמה סדרי גודל.
הבעיה השלישית היא שהוספת התוים המיוחדים מטריפה את המשתמשים שמייד ניגשים לפתרון הקל ביותר: כתיבת הסיסמה על נייר (במקרה הטוב) או באיזושהי טיוטה במייל (במקרה הפחות טוב). אנחנו לא בנויים לזכור תוים מיוחדים ומספרים. זה בלתי אפשרי.

אז מה עושים? מניחים למשתמשים לבחור במה שהם רוצים – אפשר רק אותיות רגילות (כמובן שאם משתמש רוצה אותיות גדולות או רווח מאפשרים לו) אבל קובעים גודל מינימום לסיסמה. למשל 20 תווים מינימום.
רמת האנטרופיות של סיסמה ארוכה תהיה גבוהה משמעותית. במקרה שלנו:

log2(26) X 20 = 94

(וזאת בהנחה שהמשתמש בחר ב-20 תוים בדיוק). זה אומר שהמפצח שלנו יצטרך כמו הזויה של ניסיונות:
1.9928149e+28
מדובר בכמות ניסיונות שבקצב של מיליון ניסיונות לשניה יקח אלפים רבים של שנים לפתח. גם עם המעבדים הגרפיים החזקים ביותר מדובר במשימה ממש לא אפשרית.

נשמע משוגע לגמרי? אחת מהסיסמאות שלי בעבר היתה pedo mellon a minno speak friend and enter
זו סיסמה שממש ממש קל לזכור. זה 'אמור חבר והכנס' בסינדארין ובאנגלית. אין סיכוי לשכוח אותה. במיוחד אם אתה חובב שר הטבעות. האנטרופיה של הסיסמה הזו היא 197. מספר האותיות בסיסמה (כולל הרווחים) שעומד על 42 ומוכפל ב log2(26) שזה האורך של הסיסמה.

log2(26) X 42

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

ולסיכום סיכומי בהחלט, xkcd תמיד נותן בראש:

Password Strength
לא מכירים את xkcd? כדאי לכם להכיר.

פוסטים נוספים שכדאי לקרוא

תמונת תצוגה של מנעול על מחשב
פתרונות ומאמרים על פיתוח אינטרנט

הגנה מפני XSS עם Trusted Types

תכונה ב-CSP שמאפשרת מניעה כמעט הרמטית להתקפות XSS שכל מפתח ווב צריך להכיר וכדאי שיכיר.

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

גלילה לראש העמוד