רישום באבטחת אביב - קידוד סיסמאות

מאמר זה הוא חלק מסדרה: • מדריך רישום אבטחה באביב

• תהליך ההרשמה עם אבטחת אביב

• הרשמה - הפעל חשבון חדש בדוא"ל

• רישום אבטחה באביב - שלח שוב דוא"ל אימות

• רישום באבטחת אביב - קידוד סיסמאות (מאמר נוכחי) • ממשק ה- API לרישום הופך ל- RESTful

• אבטחת אביב - אפס את הסיסמה שלך

• רישום - חוזק סיסמא וכללים

• עדכון הסיסמה שלך

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

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

ישנם כמה מנגנוני קידוד הנתמכים על ידי Spring Security - ולמאמר, נשתמש ב- BCrypt, מכיוון שזה בדרך כלל הפיתרון הטוב ביותר שיש

רוב המנגנונים האחרים, כגון MD5PasswordEncoder ו ShaPasswordEncoder השתמש באלגוריתמים חלשים יותר וכעת הוצא משימוש.

2. הגדר את מקודד הסיסמה

נתחיל בהגדרת ה- BCryptPasswordEncoder הפשוט כשעועית בתצורה שלנו:

מקודד PasswordEncoder הציבורי @Bean () {להחזיר BCryptPasswordEncoder חדש (); }

יישומים ישנים יותר - כגון SHAPasswordEncoder - ידרוש מהלקוח למסור ערך מלח בעת קידוד הסיסמה.

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

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

$ 2 א $ 10 $ ZLhnHxdpHETcxmtEStgpI. / Ri1mksgJ9iDP36FmfMdYyVg9g0b2dq

ישנם שלושה שדות המופרדים ב- $:

  1. ה "2a" מייצג את גרסת האלגוריתם BCrypt
  2. ה “10” מייצג את חוזק האלגוריתם
  3. ה "ZLhnHxdpHETcxmtEStgpI." החלק הוא למעשה המלח שנוצר באופן אקראי. בעיקרון, 22 התווים הראשונים הם מלח. החלק הנותר של השדה האחרון הוא הגרסה הממשי של הטקסט הרגיל

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

3. קידד את הסיסמה בהרשמה

כעת נשתמש ב- קוד מקודד בשלנו שירות משתמש לחשיש את הסיסמה במהלך תהליך רישום המשתמש:

דוגמא 3.1. - ה UserServicה מנקה את הסיסמה

@Autowired פרטי PasswordEncoder passwordEncoder; @Override משתמש ציבורי registerNewUserAccount (UserDto accountDto) זורק EmailExistsException {if (emailExist (accountDto.getEmail ())) {זרוק EmailExistsException חדש ("יש חשבון עם כתובת הדוא"ל הזו:" + accountDto.getEmail ()); } משתמש משתמש = משתמש חדש (); user.setFirstName (accountDto.getFirstName ()); user.setLastName (accountDto.getLastName ()); user.setPassword (passwordEncoder.encode (accountDto.getPassword ())); user.setEmail (accountDto.getEmail ()); user.setRole (תפקיד חדש (Integer.valueOf (1), משתמש)); להחזיר repository.save (משתמש); }

4. קידד את הסיסמה באימות

בואו עכשיו נתמודד עם החצי השני של התהליך ונקודד את הסיסמה כאשר המשתמש מאמת.

ראשית, עלינו להזריק את שעועית מקודדת הסיסמה שהגדרנו קודם לספק האימות שלנו:

@ UserDetailsService פרטית אוטומטית userDetailsService; @Bean הציבור DaoAuthenticationProvider authProvider () {DaoAuthenticationProvider authProvider = חדש DaoAuthenticationProvider (); authProvider.setUserDetailsService (userDetailsService); authProvider.setPasswordEncoder (מקודד ()); החזר authProvider; }

תצורת האבטחה פשוטה:

  • אנו מזריקים את היישום שלנו לשירות פרטי המשתמשים
  • אנו מגדירים ספק אימות שמפנה לשירות הפרטים שלנו
  • אנו גם מאפשרים את מקודד הסיסמה

ולבסוף, אנחנו צריכים התייחס לספק אימות זה בתצורת ה- XML ​​לאבטחה שלנו:

לחלופין, אם אתה משתמש בתצורת Java:

@Configuration @ComponentScan (basePackages = {"com.baeldung.security"}) @EnableWebSecurity המחלקה הציבורית SecSecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Override מוגן ריק להגדיר (AuthenticationManagerBuilder auth) זורק חריגה (אימות אימות) אימות; } ...}

5. מסקנה

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

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

הַבָּא » ממשק ה- API לרישום הופך ל- RESTful « רישום אבטחה באביב הקודם - שלח שוב דוא"ל אימות

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