מדריך אבטחה
מדוע Math.random אינו בטוח לסיסמאות
למדו מדוע Math.random מתאים לאפקטים חזותיים אך לא לסיסמאות, קודי איפוס, טוקנים או סודות רגישים אחרים מבחינת אבטחה.
תקציר
Math.random() היא פונקציית פסאודו-אקראיות כללית ב-JavaScript. היא שימושית לאנימציות, התנהגות ממשק אקראית, דוגמאות, משחקים וסימולציות. היא אינה מוגדרת לאבטחה קריפטוגרפית ואין להשתמש בה ליצירת סיסמאות, קודי איפוס, סודות API, מפתחות חתימה או טוקני שחזור.
הבעיה
מחולל סיסמאות זקוק לאי-חיזוי מול תוקף, לא רק לערכים שנראים מגוונים למשתמש. Math.random() אינה מספקת ערובה לאבטחה קריפטוגרפית ברמת הדפדפן, ויישומים עשויים להשתנות בין מנועים.
האפשרות הבטוחה בדפדפן
דפדפנים מודרניים מספקים crypto.getRandomValues() דרך Web Crypto API. PwdGen משתמש בממשק זה ובדגימת דחייה (rejection sampling), המונעת בחירה מוטה של תווים. אם ה-API אינו זמין, ההתנהגות הבטוחה היא להפסיק את היצירה ולהסביר את דרישת התאימות.
כיצד לבדוק מחולל
חפשו בקוד את Math.random. מחולל סיסמאות רציני לא אמור להשתמש בה לתווי סיסמה. היא עשויה להופיע בתיעוד המסביר מדוע היא לא בטוחה, אך לא בנתיב היצירה.
הנחיות מפורטות
מדריך זה מתמקד מדוע Math.random אינה מתאימה לסיסמאות וסודות. הוא נכתב עבור מפתחים, סטודנטים ומשתמשי כלים שבודקים אם מחולל משתמש באקראיות בטוחה, כך שהמטרה המעשית אינה ליצור טענת אבטחה דרמטית. המטרה היא לבחור הרגל סיסמה שיכול לשרוד שימוש יומיומי: טפסי התחברות, מנהלי סיסמאות, מקלדות ניידות, שחזור חשבון, מכשירים משותפים, ושירותים מדי פעם עם כללי אימות מוזרים. המלצה מאובטחת שימושית רק אם אדם אמיתי יכול לעקוב אחריה באופן עקבי.
נקודת ההתחלה הבטוחה ביותר היא אקראיות בתוספת ייחודיות. אקראיות פירושה שהערך נבחר ממרחב גדול על ידי מקור אקראי מתאים מבחינה קריפטוגרפית, לא הומצא מיום הולדת, שם חיית מחמד, תבנית מקלדת או ציטוט אהוב. ייחודיות פירושה שאותה סיסמה אינה בשימוש בשום מקום אחר. סיסמה ארוכה אך בשימוש חוזר עלולה להיכשל במהירות לאחר פריצה לא קשורה אחת, בעוד סיסמה אקראית ייחודית מגבילה את הנזק לחשבון הבודד שבו היא שימשה.
לנושא זה, הגדרה קבועה מעשית היא crypto.getRandomValues עם דגימת דחייה במקום Math.random. ניתן ליישם הגדרה זו עם מדריך Web Crypto API ולאחר מכן לאחסן את הערך הסופי במנהל סיסמאות מהימן. PwdGen מייצר ערכים מקומית בדפדפן עם Web Crypto; הסיסמה שנוצרה אינה נשלחת לשרת PwdGen. עיצוב מקומי זה מפחית חשיפה בצד השרת, אך אינו מגן מפני כל איום. תוסף דפדפן זדוני, מכשיר שנפרץ, דף דיוג או טיפול לא בטוח בלוח יכולים עדיין לחשוף סוד לאחר יצירתו.
הבעיות הנפוצות ביותר שיש להימנע מהן הן רצפים פסאודו-אקראיים צפויים, הטיית מודולו (modulo bias), פונקציות אקראיות מותאמות אישית, וקוד דמו שהועתק לסביבת ייצור. בעיות אלו חשובות מכיוון שתוקפים רק לעתים רחוקות צריכים לנסות כל סיסמה אפשרית בכוח גס כאשר הרגלים אנושיים נותנים להם קיצור דרך. מילוי פרטים (credential stuffing), דיוג, רשימות סיסמאות דלפות, וניצול לרעה של שחזור חשבון הם לעתים קרובות מציאותיים יותר מחיפוש מתמטי טהור. לכן העצה הטובה ביותר משלבת איכות סיסמה עם בקרות ברמת החשבון כגון MFA, מפתחות גישה (passkeys), אחסון קודי שחזור, ובדיקה שוטפת של דואר אלקטרוני או טלפון לשחזור.
השתמשו ברשימת הבדיקה הבאה בעת יישום ההמלצה:
- אל תשתמשו ב-Math.random לסיסמאות.
- השתמשו ב-Web Crypto בדפדפנים.
- השתמשו ב-Node crypto או בחבילה מאומתת בקוד CLI.
- בדקו קוד גיבוי מקרי.
אם אתר אינטרנט דוחה את ההגדרה האידיאלית, אל תכריחו את הסיסמה לתבנית חלשה יותר ידנית. שנו משתנה אחד בכל פעם. אם סמלים נדחים, השאירו אותיות גדולות, קטנות ומספרים מופעלים והגדילו את האורך. אם אורך מקסימלי נמוך, השתמשו באורך המקובל הגדול ביותר וודאו שהערך ייחודי. אם יש לקרוא סיסמה בקול רם, להדפיס אותה או להקליד אותה על מסך טלוויזיה או נתב, שקלו להחריג תווים מבלבלים ולהגדיל את האורך כדי לפצות על האלפבית הקטן יותר.
לבסוף, זכרו את הגבול של עצות סיסמה. סיסמה חזקה היא שכבת הגנה אחת, לא ערובה. היא אינה יכולה להפוך דף דיוג לבטוח, לתקן תוכנה זדונית, או לפצות על שירות שאוגר פרטי כניסה בצורה גרועה. ההרגל השימושי הוא משעמם אך עמיד: צרו ערך ייחודי, אחסנו אותו בבטחה, הגנו על נתיב השחזור, והחליפו אותו במהירות אם אתם חושדים בחשיפה.
צעד בטוח הבא
לאחר קריאת מדריך זה, בצעו ביקורת חשבון קטנה אחת במקום לנסות לתקן הכל בבת אחת. בחרו את החשבון שיגרום הכי הרבה צרות אם ישתלטו עליו, אשרו שהסיסמה שלו ייחודית, ובדקו את דואר השחזור, טלפון השחזור, שיטת MFA ואחסון קודי הגיבוי. אם חלק כלשהו בשרשרת זו חלש, שפרו אותו לפני המעבר לחשבונות בסיכון נמוך יותר. סדר זה שומר על העבודה ניתנת לניהול ומגן על החשבונות שתוקפים צפויים להשתמש בהם כקרש קפיצה. לגבי מדוע math.random אינה בטוחה לסיסמאות, התוצאה הטובה ביותר היא הרגל שניתן לחזור עליו: צרו מקומית, אחסנו בזהירות, והימנעו משימוש חוזר.
שאלות נפוצות
האם Math.random אי פעם בסדר?
כן, לאפקטים חזותיים, סימולציות ואקראיות ממשק רגילה, אך לא לפרטי כניסה או טוקני אבטחה.
במה מחוללי סיסמאות צריכים להשתמש במקום?
עליהם להשתמש במקור אקראי קריפטוגרפי כגון crypto.getRandomValues() בדפדפן.
האם PwdGen נופל ל-Math.random?
לא. אם Web Crypto אינו זמין, PwdGen מציג אזהרת תאימות ואינו יוצר סיסמאות עם Math.random().