JavaRush /בלוג Java /Random-HE /שאלות ותשובות: מדוע עדיף לאחסן סיסמה ב-Java במערך תווים ו...

שאלות ותשובות: מדוע עדיף לאחסן סיסמה ב-Java במערך תווים ולא במחרוזת?

פורסם בקבוצה
אולי תשמע שאלה כזו בראיון לתפקיד ג'אווה ג'וניור. אבל חברי נשאל את זה במהלך ראיון לתפקיד מוביל טכני.
שאלות ותשובות: מדוע עדיף לאחסן סיסמה ב-Java במערך תווים ולא במחרוזת?  - 1
ניתן להשתמש גם Stringוגם במערך תווים לאחסון נתוני טקסט. אבל בחירה מודעת של זה או אחר למשימה ספציפית היא קשה אם עדיין לא נתקלת במצב דומה. עם זאת, כפי שחבר שלי ציין, כל שאלה הקשורה ל- String, בדרך כלל כרוכה בתכונה מיוחדת של מחרוזות הנקראת אי-שינוי ( Immutable), והוא ניצל זאת בראיון. אז, בואו נסתכל על כמה סיבות מדוע כדאי להשתמש ב- char [], ולא ב-, כדי לאחסן את הסיסמה שלך String.

סיבה 1. המיתרים אינם ניתנים לשינוי

מכיוון שהמחרוזות אינן ניתנות לשינוי ב-Java, סיסמת הטקסט הפשוט שלך תהיה זמינה בזיכרון עד שאוסף האשפה ינקה אותה. ומכיוון Stringשהם משמשים String poolלשימוש חוזר, ישנה סבירות גבוהה למדי שהסיסמה תישאר בזיכרון לאורך זמן, דבר שאינו מאובטח כלל.
Java String pool הוא בריכה או קבוצה של אובייקטים (מחרוזות) שנמצאים במקום מיוחד - הערימה. מחרוזת ב-Java היא אחד מסוגי הנתונים הנפוצים ביותר. זה לא טיפוס פרימיטיבי, אלא אובייקט, מכיוון שהוא מאוד עתיר משאבים. לכן, כדי לאחסן מחרוזת של ארבעה תווים, אתה צריך להקצות 56 בתים של זיכרון. זו הסיבה שחרוזים, כמו חפצים אחרים, מאוחסנים בערימה.
כל מי שיש לו גישה ל-dump memory יכול למצוא את הסיסמה בטקסט רגיל, וזו סיבה טובה להשתמש בסיסמה מוצפנת ולא בטקסט רגיל. מכיוון שהמחרוזות אינן ניתנות לשינוי, לא ניתן לשנות את תוכנן. כל שינוי ייצור שורה חדשה. אבל במקרה של char [], אתה יכול להחליף כל אחד מהאלמנטים שלו באפס או בתו ריק. לפיכך, אחסון הסיסמה במערך תווים מפחית בבירור את הסיכון ליירוט סיסמה.

סיבה 2. המלצות מחברים

Java עצמה (טוב, דרך יוצריה, כמובן) ממליצה להשתמש בשיטה getPassword ()מהמחלקה JPasswordFieldשמחזירה char []. אתה יכול גם לנסות את השיטה שהוצאה משימוש getText (). למה לא להישמע להמלצות של מחברי השפה?

סיבה 3. הדפס

עם סוג Stringיש תמיד סכנה שהטקסט המאוחסן במחרוזת יודפס בקובץ היומן או בקונסולה. יחד עם זאת, אם תשתמש ב- Array, לא תדפיס את תוכן המערך, אלא רק את מיקומו בזיכרון. כמובן שזו לא בדיוק סיבה רצינית, אבל עדיין זה גם הגיוני.
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);

String password: Unknown
Character password: [C@110b053
כמובן ששימוש char []ב-Java לאחסון סיסמאות בפני עצמו אינו תרופת פלא. עליך לנקוט באמצעי זהירות, כגון עבודה עם hashes והצפנת סיסמאות במקום לאחסן אותן בטקסט רגיל. וכמובן, מחק אותו מהזיכרון מיד לאחר הליך האימות. מבוסס על חומרים מ- Javarevisited
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION