זין סיסמה בג'אווה

ג'אווה טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. סקירה כללית

במדריך זה נדון בחשיבות גיבוב הסיסמה.

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

2. מה Hashing?

Hashing הוא תהליך של יצירת מחרוזת, או בְּלִיל, מנתון הוֹדָעָה באמצעות פונקציה מתמטית המכונה a פונקציית hash קריפטוגרפית.

אמנם יש כמה פונקציות hash שם, אך אלה המותאמים לסיסמאות hashing צריכות להיות בעלות ארבעה מאפיינים עיקריים כדי להיות מאובטחים:

  1. זה צריך להיות דטרמיניסטי: אותה הודעה שעובדה על ידי אותה פונקציית hash צריכה תמיד לייצר את אותו הדבר בְּלִיל
  2. זה לא הָפִיך: זה לא מעשי ליצור הוֹדָעָה משלה בְּלִיל
  3. יש לו גבוה אנטרופיה: שינוי קטן ל- הוֹדָעָה צריך לייצר שונה בתכלית בְּלִיל
  4. וזה מתנגד התנגשויות: שניים שונים הודעות לא צריך לייצר את אותו הדבר בְּלִיל

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

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

כמה פונקציות חשיש נהדרות העומדות בכל הקריטריונים הללו הןPBKDF2, BCrypt, ו SCrypt. אבל ראשית, בואו נסתכל על כמה אלגוריתמים ישנים יותר ומדוע הם כבר לא מומלצים

3. לא מומלץ: MD5

פונקציית החשיש הראשונה שלנו היא אלגוריתם העיכול של הודעות MD5, שפותח עוד בשנת 1992.

Java MessageDigest עושה את זה קל לחישוב ועדיין יכול להיות שימושי בנסיבות אחרות.

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

בגלל אלה, MD5 אינו מומלץ.

4. לא מומלץ: SHA-512

לאחר מכן, נסתכל על SHA-512, שהיא חלק ממשפחת האלגוריתמים Secure Hash, משפחה שהחלה ב- SHA-0 עוד בשנת 1993.

4.1. מדוע SHA-512?

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

SHA-512 מייצג את המפתח הארוך ביותר בדור השלישי של האלגוריתם.

בזמן כעת יש גרסאות מאובטחות יותר של SHA, SHA-512 הוא החזק ביותר המיושם בג'אווה.

4.2. יישום ב- Java

עכשיו, בואו נסתכל על יישום אלגוריתם הגיבוב של SHA-512 בג'אווה.

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

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

פונקציית החשיש החדשה שלנו הופכת בערך ל:

מלח <- ליצור מלח; hash <- מלח + ':' + sha512 (מלח + סיסמא)

4.3. יצירת מלח

כדי להכניס מלח, נשתמש ב- SecureRandom כיתה מ java.security:

SecureRandom אקראי = SecureRandom חדש (); בתים [] מלח = בתים חדשים [16]; random.nextBytes (מלח);

ואז נשתמש ב- MessageDigest בכיתה כדי להגדיר את SHA-512 פונקציית חשיש עם המלח שלנו:

MessageDigest md = MessageDigest.getInstance ("SHA-512"); md.update (מלח);

ועם זה נוסף, אנו יכולים כעת להשתמש ב- לְעַכֵּל שיטה ליצירת סיסמת הגיבוב שלנו:

בתא [] hashedPassword = md.digest (passwordToHash.getBytes (StandardCharsets.UTF_8));

4.4. מדוע זה לא מומלץ?

כאשר משתמשים במלח, SHA-512 היא עדיין אפשרות הוגנת, אבל יש אפשרויות חזקות ואיטיות יותר שם.

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

5. PBKDF2, BCrypt ו- SCrypt

PBKDF2, BCrypt ו- SCrypt הם שלושה אלגוריתמים מומלצים.

5.1. מדוע אלו מומלצים?

כל אחד מאלה איטי, ולכל אחד מהם התכונה המבריקה שיש לו חוזק הניתן להגדרה.

משמעות הדבר היא שככל שמחשבים גדלים בכוח, אנו יכולים להאט את האלגוריתם על ידי שינוי התשומות.

5.2. יישום PBKDF2 בג'אווה

עַכשָׁיו, מלחים הם עיקרון בסיסי של חשיפת סיסמאולכן אנו זקוקים לאחד עבור PBKDF2:

SecureRandom אקראי = SecureRandom חדש (); בתים [] מלח = בתים חדשים [16]; random.nextBytes (מלח);

לאחר מכן, ניצור PBEKeySpec ו SecretKeyFactory אשר נקים באמצעות PBKDF2WithHmacSHA1 אַלגוֹרִיתְם:

מפרט KeySpec = PBEKeySpec חדש (password.toCharArray (), מלח, 65536, 128); מפעל SecretKeyFactory = SecretKeyFactory.getInstance ("PBKDF2WithHmacSHA1");

הפרמטר השלישי (65536) הוא למעשה פרמטר הכוח. זה מציין כמה חזרות שמריץ אלגוריתם זה, ומגדיל את הזמן שנדרש לייצור החשיש.

לבסוף, אנו יכולים להשתמש שלנו SecretKeyFactory כדי ליצור את החשיש:

בייט [] hash = factory.generateSecret (spec). getEncoded ();

5.3. יישום BCrypt ו- SCrypt בג'אווה

אז מסתבר ש תמיכה ב- BCrypt ו- SCrypt עדיין לא נשלחת עם Javaלמרות שחלק מספריות Java תומכות בהן.

אחת מאותן ספריות היא Spring Security.

6. סיסמת סיסמה עם אבטחת אביב

למרות שג'אווה תומכת באופן מקורי גם באלגוריתמי ה- hash של PBKDF2 וגם ב- SHA, היא אינה תומכת באלגוריתמים של BCrypt ו- SCrypt.

למזלנו, Spring Security נשלח עם תמיכה בכל האלגוריתמים המומלצים הללו דרך ה- קוד מקודד מִמְשָׁק:

  • MessageDigestPasswordEncoder נותן לנו MD5 ו- SHA-512
  • Pbkdf2PasswordEncoder נותן לנו PBKDF2
  • BCryptPasswordEncoder נותן לנו BCrypt, ו-
  • SCryptPasswordEncoder נותן לנו SCrypt

מקודדי הסיסמאות עבור PBKDF2, BCrypt ו- SCrypt מגיעים כולם עם תמיכה בקביעת תצורת החוזק הרצוי של hash הסיסמה.

אנו יכולים להשתמש בקודנים אלה ישירות, גם מבלי שיהיה לנו אפליקציה מבוססת Spring Security. לחלופין, אם אנו מגנים על האתר שלנו באמצעות Spring Security, אנו יכולים להגדיר את מקודד הסיסמאות הרצוי לנו באמצעות ה- DSL שלו או באמצעות הזרקת תלות.

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

7. מסקנה

אז עשינו צלילה עמוקה לביצוע סיסמא; חקר הרעיון והשימושים בו.

ובדקנו כמה פונקציות hash היסטוריות וכן כמה מהן מיושמות כעת לפני קידודן ב- Java.

לבסוף ראינו כי Spring Security נשלחת עם שיעורי הצפנת הסיסמאות שלה, ומיישמת מערך של פונקציות חשיש שונות.

כמו תמיד, הקוד זמין ב- GitHub.

תחתית Java

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

$config[zx-auto] not found$config[zx-overlay] not found