אולי תשמע שאלה כזו בראיון לתפקיד ג'אווה ג'וניור. אבל חברי נשאל את זה במהלך ראיון לתפקיד מוביל טכני.
ניתן להשתמש גם
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
GO TO FULL VERSION