מקודד סיסמא המוגדר כברירת מחדל באביב אבטחה 5

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

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

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

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

2. אבטחת אביב 4

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

המחלקה הציבורית @Configuration InMemoryAuthWebSecurityConfigurer מרחיב את WebSecurityConfigurerAdapter {@Override מוגן חלל להגדיר (AuthenticationManagerBuilder auth) זורק Exception {auth.inMemoryAuthentication () .withUser ("אביב"). סיסמה ("סוד") ". } התצורה הריקה המוגנת על ידי @Override (HttpSecurity http) זורקת חריג {http.authorizeRequests () .antMatchers ("/ private / **"). מאומת () .antMatchers ("/ public / **") .permitAll () .and () .httpBasic (); }} 

תצורה זו מגדירה אימות לכל /פְּרָטִי/ שיטות ממופה וגישה ציבורית לכל מה שנמצא תחת /פּוּמְבֵּי/.

אם אנו משתמשים באותה תצורה תחת Spring Security 5, נקבל את השגיאה הבאה:

java.lang.IllegalArgumentException: אין PasswordEncoder ממופה למזהה "null"

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

3. אבטחת אביב 5

אנו יכולים לתקן שגיאה זו על ידי הגדרת a אֲצִילָהקוד מקודד עם ה PasswordEncoderFactories מעמד.

אנו משתמשים בקודן זה כדי להגדיר את המשתמש שלנו עם ה- AuthenticationManagerBuilder:

המחלקה הציבורית @Configuration InMemoryAuthWebSecurityConfigurer מרחיב את WebSecurityConfigurerAdapter {@Override מוגן חלל להגדיר (AuthenticationManagerBuilder auth) זורק חריג {PasswordEncoder מקודד = PasswordEncoderFactories.createDelegatingPasswordEncoder (); auth.inMemoryAuthentication () .withUser ("קפיץ"). סיסמה (encoder.encode ("סודי")) .roles ("USER"); }} 

כעת, עם תצורה זו, אנו שומרים את סיסמת הזיכרון שלנו באמצעות BCrypt בתבנית הבאה:

{bcrypt} $ 2a $ 10 $ MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS 

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

3.2. NoOpPasswordEncoder

אם מסיבה כלשהי איננו רוצים לקודד את הסיסמה שהוגדרה, נוכל להשתמש ב- NoOpPasswordEncoder.

לשם כך, אנו פשוט מקדים את משפט הסיסמה שאנו מספקים ל- סיסמה() שיטה עם {noop} מזהה:

המחלקה הציבורית @Configuration InMemoryNoOpAuthWebSecurityConfigurer מרחיב את WebSecurityConfigurerAdapter {@Override מוגן חלל מוגדר (AuthenticationManagerBuilder auth) זורק Exception {auth.inMemoryAuthentication () .withUser ("spring") .password ("{no}). }} 

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

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

3.3. העברת סיסמאות קיימות

אנו יכולים לעדכן סיסמאות קיימות לתקנים המומלצים של Spring Security 5 על ידי:

  • עדכון סיסמאות המאוחסנות בטקסט רגיל עם ערכן המקודד:
מחרוזת מקודדת = BCryptPasswordEncoder חדש (). קידוד (plainTextPassword); 
  • קידומת קידומת סיסמאות מאוחסנות עם מזהה המקודד הידוע שלהם:
{bcrypt} $ 2a $ 10 $ MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS {sha256} 97cde38028ad898ebc02e690819fa220e88c62e0699403e94f94ff 
  • בקשה ממשתמשים לעדכן את הסיסמאות שלהם כאשר מנגנון הקידוד של סיסמאות מאוחסנות אינו ידוע

4. מסקנה

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

כמו תמיד, אתה יכול למצוא את קוד המקור בפרויקט GitHub.


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