JavaRush /وبلاگ جاوا /Random-FA /پرسش و پاسخ: چرا بهتر است یک رمز عبور در جاوا در یک آرایه...

پرسش و پاسخ: چرا بهتر است یک رمز عبور در جاوا در یک آرایه کاراکتر به جای یک رشته ذخیره شود؟

در گروه منتشر شد
ممکن است چنین سوالی را در مصاحبه ای برای موقعیت جاوا جونیور بشنوید. اما از دوستم در طی مصاحبه ای برای سمت سرپرست فنی این سوال پرسیده شد.
پرسش و پاسخ: چرا بهتر است یک رمز عبور در جاوا در یک آرایه کاراکتر به جای یک رشته ذخیره شود؟  - 1
هر دو String، و یک آرایه کاراکتر می توانند برای ذخیره داده های متنی استفاده شوند. اما اگر هنوز با موقعیت مشابهی روبرو نشده اید، انتخاب آگاهانه یکی یا دیگری برای یک کار خاص دشوار است. با این حال، همانطور که دوست من اشاره کرد، هر سوالی که مربوط به String, معمولاً دارای خاصیت خاصی از رشته ها به نام تغییرناپذیری ( Immutable) است و او در مصاحبه از این موضوع استفاده کرد. بنابراین، اجازه دهید به چند دلیل برای ذخیره رمز عبور خود char []و نه استفاده از آن نگاه کنیم String.

دلیل 1. رشته ها تغییر ناپذیر هستند

از آنجایی که رشته ها در جاوا تغییر ناپذیر هستند، رمز عبور متن ساده شما تا زمانی که زباله جمع کننده آن را پاک کند در حافظه موجود خواهد بود. و از آنجایی که Stringاز آنها برای استفاده مکرر استفاده می شود String pool، احتمال نسبتاً زیادی وجود دارد که رمز عبور برای مدت طولانی در حافظه باقی بماند، که اصلا ایمن نیست.
استخر رشته جاوا یک استخر یا مجموعه ای از اشیاء (رشته ها) است که در یک مکان خاص - پشته قرار دارد. رشته در جاوا یکی از رایج ترین انواع داده است. این یک نوع اولیه نیست، بلکه یک شی است، زیرا بسیار منابع فشرده است. بنابراین، برای ذخیره یک رشته از چهار کاراکتر، باید 56 بایت حافظه اختصاص دهید. به همین دلیل است که رشته ها مانند سایر اشیاء روی پشته ذخیره می شوند.
هر کسی که به یک حافظه خالی دسترسی دارد می تواند رمز عبور را در متن ساده پیدا کند، که دلیل خوبی برای استفاده از رمز عبور رمزگذاری شده به جای متن ساده است. از آنجایی که رشته ها تغییر ناپذیر هستند، محتویات آنها را نمی توان تغییر داد. هر تغییری یک خط جدید ایجاد می کند. اما در مورد char [], می توانید هر یک از عناصر آن را با صفر یا یک کاراکتر خالی جایگزین کنید. بنابراین، ذخیره رمز عبور در یک آرایه کاراکتر به وضوح خطر رهگیری رمز عبور را کاهش می دهد.

دلیل 2. توصیه های نویسندگان

خود جاوا (البته از طریق سازندگانش) استفاده از روشی getPassword ()از کلاسی JPasswordFieldکه برمی گرداند را توصیه می کند char []. همچنین می توانید روش منسوخ شده را امتحان کنید getText (). چرا توصیه های نویسندگان زبان را دنبال نمی کنید؟

دلیل 3. چاپ

با یک نوع Stringهمیشه این خطر وجود دارد که متن ذخیره شده در رشته در فایل log یا در کنسول چاپ شود. در عین حال، در صورت استفاده از 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 []جاوا برای ذخیره پسوردها به خودی خود نوشدارویی نیست. شما باید اقدامات احتیاطی امنیتی را انجام دهید، مانند کار با هش و رمزگذاری رمزهای عبور به جای ذخیره آنها در متن ساده. و البته بلافاصله پس از احراز هویت، آن را از حافظه حذف کنید. بر اساس مطالب Javarevisited
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION