גיבוב סיסמה
אחסון סיסמאות משתמש הוא אחד הדברים הגרועים ביותר שאפשר לעשות בטקסט רגיל, ואחת מטעויות האבטחה הנפוצות ביותר. התיקון קיים כבר עשרות שנים - גיבוב סיסמאות עם אלגוריתמים איטיים וקשים לזיכרון - אבל ההבדל בין יישומים טובים ורעים הוא עצום, ורוב פרצות הנתונים חושפות בחירות גרועות.
גוף המאמר המלא מסופק באנגלית להלן.
Password hashing הוא הנוהג של אחסון טרנספורמציה חד-כיוונית של סיסמת המשתמש במקום הסיסמה עצמה. כאשר המשתמש מתחבר, אותה טרנספורמציה מוחלת על הקלט שלו ומשווה לערך המאוחסן. אם מסד הנתונים המאוחסן נפרץ, לתוקף יש גיבוב, לא סיסמאות - ושחזור המקורות אמור להיות בלתי אפשרי מבחינה חישובית.
Tזו התיאוריה. התרגול נע בין "עובד כפי שפורסם" ל-"אולי גם היה טקסט רגיל", תלוי באיזה אלגוריתם ופרמטרים נבחרו.
מה צריך גיבוב סיסמה טוב
- חד כיווני. ידיעת ה-hash לא אמורה לגלות שום דבר מועיל לגבי password.
- Salted. לכל משתמש יש מלח אקראי ייחודי מעורב ב-hash. מונע טבלאות קשת מחושבות מראש ומבטיח שסיסמאות זהות מייצרות גיבובים שונים.
- Slow. חישוב גיבוב בודד אמור לקחת שבריר שנייה משמעותי בחומרת התוקף. כוח אכזרי במיליארדי שניה הוא מה שמביס גיבובים מהירים.
- Memory-hard. כל חשיש צריך לדרוש זיכרון RAM משמעותי, מביס את ההקבלה של GPU ו-ASIC המשגשגת על זיכרון קטן לכל מופע. כלפי מעלה ככל שהחומרה נעשית מהר יותר.
הבחירות השגויות
אלגוריתמים שאסור לכם להשתמש בהם לאחסון סיסמאות:
- MD5. נשבר מבחינה קריפטוגרפית מאז 2004. hardware.
- SHA-1, SHA-256. גיבובים קריפטוגרפיים מהירים המיועדים לבדיקת תקינות, לא לאחסון סיסמאות. ניתן לאלץ אכזרי במיליארדי שנייה במעבדי GPU.
- סיסמאות מוצפנות. אם אתה יכול לפענח אותן בחזרה לטקסט רגיל, גם תוקף שגונב את המפתח יכול. האשינג היא התשובה; הצפנה אינה.
- Plaintext. עדיין מתרחשת בשנת 2026. כל הפרת סיסמה של טקסט רגיל היא הנדסה ניתנת למניעה.
הבחירות הנכונות
שלושת המומלצים המודרניים אלגוריתמים:
- bcrypt (1999). גורם עלות מתכוונן (סבבי חישוב). מוגבל לסיסמאות של 72 בתים. לא קשה בזיכרון, כך שמעבדי GPU יכולים לתקוף אותו ביעילות - אבל גורם עלות סביר עדיין מייקר התקפות. פריסה רחבה, פשוטה לשימוש נכון.
- scrypt (2009). זיכרון קשה. עלות זיכרון ניתנת להגדרה, מקביליות ועלות מעבד. מורכב יותר מ-bcrypt; לפעמים מוגדר בצורה שגויה.
- Argon2 (זוכה בתחרות גיבוב סיסמאות 2015). שלוש גרסאות: Argon2d (תלוי בנתונים, עמיד בפני התקפות GPU אך פגיע לערוצים צדדיים), Argon2i (בלתי תלוי בנתונים, עמיד לערוץ צדדי), Argon2id (היברידית - ברירת המחדל המומלצת). מודרנית, מאובחנת היטב, הבחירה הנכונה למערכות חדשות.
OWASP ממליץ כרגע על Argon2id עם לפחות 19 מגה-בייט זיכרון, ספירת איטרציות של 2 ומקביליות של 1. עבור מערכות שבהן Argon2 אינו זמין, bcrypt עם עלות של ≥ 10 או scrypt קבילים עם פרמטרים מתאימים של fallbackat PL7XWh. "איטי" פירושו בפועל
מקדם עלות של 10 ב-bcrypt פירושו בערך 100 אלפיות השנייה ל-hash בחומרה מודרנית. עבור משתמש לגיטימי שמתחבר, זה לא מורגש. עבור תוקף שמנסה לאלץ 100 מיליון סיסמאות ממסד נתונים שדלף, מדובר ב-100 מיליון × 100 אלפיות השנייה = 116 ימים של זמן GPU בכל מעבר ברשימת מילים סבירה. בשילוב עם מלח ייחודי לכל משתמש, טבלאות קשת גדולות חסרות תועלת.
עבור hash מהיר כמו SHA-256 ללא מלח, אותה פעולה לוקחת כמה דקות על אותה חומרה.
טיפול במלח
- CSNG נוצר על ידי משתמש, על ידי משתמש, יצירת
- 16 בתים מספיקה (128 סיביות של אקראיות)
- Salt מאוחסן לצד ה-hash, לא סודי - תפקידו הוא להיות ייחודי, לא מוסתר
- רוב ספריות ה-hashing המודרניות (bcrypt, Argon2) כוללות פלטי פרמטר astring, bundle, a-string, חבילה בודדים של PHC, string
Pepper: אופציונלי extra
A pepper הוא ערך סודי ברחבי האתר המתווסף לקלט ה-hash, המאוחסן בנפרד ממסד הנתונים (בתצורת HSM, כספת מפתחות או אפליקציה). אם מסד הנתונים נזרק אבל הפלפל לא, אי אפשר לשחזר את ה-hash אפילו עם מלח המשתמש - כי לתוקף אין את הפלפל. Pepper הוא תוספת שימושית של חגורה ופלטה למערכות בעלות ערך גבוה.
שדרוג hashes בבטחה
כאשר אתה משנה פרמטרים או מעביר אלגוריתמים, אינך יכול לבצע hash מחדש ללא הסיסמה המקורית. הגישה הסטנדרטית:
- כל רשומת משתמש מאחסנת את אלגוריתם ה-hash הנוכחי שלו, פרמטרים, salt ו-hash.
- On התחברות, אמת מול ה-hash המאוחסן עם הפרמטרים המקוריים שלו.
- אם האימות מצליח והפרמטרים אינם מעודכנים עם הפרמטרים הנוכחיים ועדכן מחדש את הפרמטרים הנוכחיים. record.
בתוך מספר חודשים של משתמשים פעילים, מסד הנתונים עובר לפרמטרים חדשים מבלי לאלץ איפוסי סיסמה.
מה זה אומר עבור המשתמשים
עבור משתמשי קצה, ההשפעה המעשית: גם כאשר מסד נתונים נפרץ, למנהל סיסמה חזקה ויחודית יש סיסמה חזקה פלוס XXXX16X1Z1. שרת אומר שהסיסמה נשארת סודית למעשה. סיסמאות חלשות נסדקות אפילו ממאגרי מידע מגוהבים היטב; המשתמש הוא המשתנה שמפתח לא יכול לשלוט בו.
שאלות נפוצות
- מדוע bcrypt מוגבלת ל-72 תווים?
- פירוט יישום היסטורי של צופן Blowfish הבסיסי. כניסות ארוכות יותר נקצצות. רוב המשתמשים לא שמים לב; ביטוי סיסמה אקראי של 16 תווים הוא הרבה מתחת לגבול. עבור מערכות שרוצות אורך סיסמה בלתי מוגבל, ל-Argon2 אין הגבלה כזו.
- האם עלי להמליח ולפלפל את הסיסמאות שלי?
- יש צורך במלח (וכל ספרייה מכובדת עושה זאת באופן אוטומטי). Pepper הוא אופציונלי אך בעל ערך עבור מערכות אבטחה גבוהות. הפשרה: ניהול הפלפל כסוד לטווח ארוך מחוץ למאגר מוסיף מורכבות תפעולית. רוב האפליקציות מאחסנות מלח + חשיש; הגדולים שבהם מאחסנים מלח + חשיש + חשיש שמקורו בפלפל.
- האם Argon2 תמיד טוב יותר מ-bcrypt?
- למערכות חדשות, כן. Argon2 עמיד בזיכרון (עמיד בפני GPU/ASIC), אין לו מגבלה של 72 תווים, וזכתה בתחרות גיבוש הסיסמה מסיבות טובות. bcrypt עדיין מקובל כאשר Argon2 אינו זמין או אילוצים ארגוניים מעדיפים את התקן הישן יותר. עבור מערכות מדור קודם המשתמשות ב-bcrypt בעלות של ≥ 10, הדחיפות להגירה נמוכה.
- כמה זמן צריך לקחת לגיבוב סיסמה?
- OWASP מציע בסביבות 100-500 ms על החומרה של השרת. מהיר יותר פירושו חלש יותר מול תוקפים; איטי יותר מתחיל להשפיע על חווית הכניסה הלגיטימית. המספר הנכון תלוי בתנועה שלך - שירותים בנפח גבוה בוחרים בעלות נמוכה יותר; שירותים בעלי אבטחה גבוהה עם תעריפי כניסה נמוכים יכולים לבחור גבוה יותר.
- האם אני יכול לאחסן סיסמאות מוצפנות במקום hash?
- אל תעשה. ההצפנה היא הפיכה, מה שאומר שמפתח ההצפנה חייב להתקיים במקום בו האפליקציה יכולה לגשת. אם מסד הנתונים נפרץ, המפתח הוא לעתים קרובות מדי, ואחסנת למעשה טקסט רגיל. האי-הפיך של Hashing הוא העיקר - אפילו האפליקציה שלך לא יכולה לשחזר את הסיסמה, שהיא נכס האבטחה.