قد تسمع مثل هذا السؤال في مقابلة لمنصب Java Junior. ولكن سُئل صديقي هذا خلال مقابلة لمنصب القائد الفني.
سؤال وجواب: لماذا من الأفضل تخزين كلمة المرور في Java في مصفوفة أحرف بدلاً من سلسلة؟  - 1
يمكن استخدام كل من Stringومصفوفة الأحرف لتخزين البيانات النصية. لكن الاختيار الواعي لواحدة أو أخرى لمهمة معينة أمر صعب إذا لم تكن قد واجهت موقفًا مشابهًا بعد. ومع ذلك، كما أشار صديقي، فإن أي سؤال متعلق بـ String، عادةً ما يتضمن خاصية خاصة للسلاسل تسمى الثبات ( Immutable)، وقد استفاد من ذلك في المقابلة. لذلك، دعونا نلقي نظرة على بعض الأسباب التي تدفعك إلى استخدام char []، وليس تخزين كلمة المرور الخاصة بك String.

السبب 1. السلاسل غير قابلة للتغيير

نظرًا لأن السلاسل غير قابلة للتغيير في Java، فستكون كلمة المرور ذات النص العادي متاحة في الذاكرة حتى يقوم جامع البيانات المهملة بمسحها. وبما Stringأنها تستخدم String poolللاستخدام المتكرر، هناك احتمال كبير إلى حد ما أن كلمة المرور ستبقى في الذاكرة لفترة طويلة، وهي ليست آمنة على الإطلاق.
تجمع Java String عبارة عن تجمع أو مجموعة من الكائنات (سلاسل) الموجودة في مكان خاص - الكومة. تعد السلسلة في Java أحد أكثر أنواع البيانات شيوعًا. هذا ليس نوعًا بدائيًا، ولكنه كائن، لأنه كثيف الاستخدام للموارد. لذلك، لتخزين سلسلة من أربعة أحرف، تحتاج إلى تخصيص 56 بايت من الذاكرة. ولهذا السبب يتم تخزين السلاسل، مثل الكائنات الأخرى، في الكومة.
يمكن لأي شخص لديه حق الوصول إلى تفريغ الذاكرة العثور على كلمة المرور بنص عادي، وهو سبب وجيه لاستخدام كلمة مرور مشفرة بدلاً من النص العادي. نظرًا لأن السلاسل غير قابلة للتغيير، فلا يمكن تغيير محتوياتها. سيؤدي أي تغيير إلى إنشاء سطر جديد. لكن في حالة 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 لتخزين كلمات المرور في حد ذاته ليس حلاً سحريًا. يتعين عليك اتخاذ الاحتياطات الأمنية، مثل العمل مع التجزئة وتشفير كلمات المرور بدلاً من تخزينها في نص عادي. وبطبيعة الحال، قم بحذفه من الذاكرة مباشرة بعد إجراء المصادقة. بناءً على مواد من Javarevisited