מה עולה סיסמה בחומרה צנועה
במאמר הזה
אפשר להגן בסיסמה על דפי הסטטיסטיקה כאן. גיבוב הסיסמה הזאת הוא הפעולה היחידה בשירות הזה שאמורה להיות איטית — זה מה שהופך תקיפה של ערך גיבוב גנוב ליקרה. השאלה היא כמה איטית, בחומרה הזאת.
נמדד במחשב שמפעיל את האתר הזה, PHP 8:
PASSWORD_DEFAULT | 560 ms | (מתורגם לעלות 12) |
| עלות 12 | 595 ms | |
| עלות 11 | 277 ms | |
| עלות 10 | 138 ms |
פרמטר העלות של bcrypt הוא מעריך: כל שלב מכפיל את העבודה. המדידות מראות בדיוק את ההכפלה הזאת, וזה סימן טוב ששום דבר אחר אינו מפריע.
למה ברירת המחדל היא הבחירה הלא מתאימה כאן
השפה PHP העלתה את עלות ברירת המחדל של bcrypt מ־10 ל־12. בשרת מחשב שולחני זה שדרוג סביר — מדובר בכמה עשרות אלפיות השנייה. בחומרה צנועה מדובר ביותר מחצי שנייה של זמן מעבד בלבד, במחשב שגם מצייר באותו זמן תמונות מונה לכל האחרים.
חצי שנייה לכל כניסה היא בעיה בפני עצמה. היא גרועה יותר כהזמנה: כל אחד יכול לפנות לנקודת הקצה לכניסה, וכל פנייה צורכת 560 ms מהמעבד שמשרת את האתר כולו. כך אימות הסיסמה הופך למשטח התקיפה הזול ביותר הזמין למניעת שירות.
לכן העלות מקובעת ל־10 במקום להישאר בברירת המחדל. זה חלש יותר במכוון ממה ש־PHP בוחרת כעת, וצריך לומר זאת במפורש במקום לקבור את המידע: תקיפת ערך גיבוב בעלות 10 זולה פי ארבעה מתקיפת ערך גיבוב בעלות 12. מה שמאזן זאת הוא הדבר שהסיסמה מגינה עליו בפועל — הנראות של דף עם מספרי ביקורים, לא חשבון, לא כסף ולא זהות. אין מאחוריה דבר שאפשר להשתלט עליו.
החלק שקל לפספס
PASSWORD_DEFAULT הוא ערך משתנה בכוונה. קוד שנכתב לפני שנים ומשתמש בו ייעשה איטי יותר בשקט עם כל שדרוג PHP — אותו מקור, אותו קלט, זמן ריצה ארוך פי כמה. זאת ההתנהגות המיועדת, והיא מתאימה לרוב התוכנות.
היא שגויה רק כשהמחשב אינו יכול לספוג אותה, ושום דבר אינו מתריע כשהוא אינו יכול. השדרוג מצליח, הבדיקות עוברות, הדף עדיין עובד. הוא רק דורש עוד חצי שנייה, ואיש אינו מסתכל על המספר הזה אלא אם יוצאים למדוד אותו.