JavaRush /Java блог /Random UA /Питання-відповідь: чому пароль у Java краще зберігати в м...

Питання-відповідь: чому пароль у Java краще зберігати в масиві символів, а не в String?

Стаття з групи Random UA
Ви можете почути таке питання на інтерв'ю на позицію Java Junior. Але моєму приятелю його поставабо на співбесіді на посаду Technical Lead.
Питання-відповідь: чому пароль у Java краще зберігати в масиві символів, а не в String?  - 1
І String, і масив символів можна використовуватиме зберігання текстових даних. Але усвідомлений вибір одного чи іншого для конкретного завдання складний, якщо ви ще не стикалися з подібною ситуацією. Однак, як зауважив мій друг, будь-яке питання, пов'язане з String, зазвичай пов'язане з таким особливим властивістю рядків, як незмінність ( Immutable), і він скористався цим на співбесіді. Отже, давайте розберемо кілька причин, чому для зберігання пароля потрібно використовувати char [], а не String.

Причина 1. Рядки – незмінні

Оскільки рядки в Java є незмінними, ваш пароль у вигляді звичайного тексту буде доступний у пам'яті, поки збирач сміття не очистить її. І оскільки Stringвикористовуються String poolдля повторного використання, існує досить висока ймовірність того, що пароль залишиться в пам'яті надовго, що зовсім не безпечно.
Java String pool - це пул або набір об'єктів (рядків), який розташований у спеціальному місці - купі (Heap). String в Java - один із найпоширеніших типів даних. Не примітивний тип, а об'єкт, оскільки дуже ресурсозатратний. Так, для зберігання рядка із чотирьох символів необхідно виділити 56 байт пам'яті. Ось чому рядки, як і інші об'єкти, зберігаються в купі.
Будь-який, хто має доступ до дампи пам'яті, може знайти пароль у текстовому вигляді, і це є серйозною причиною, щоб використовувати зашифрований пароль, а не простий текст. Оскільки рядки є незмінними, їх не можна змінити. Будь-яка зміна призведе до створення нового рядка. А ось у випадку з char [], ви можете замінити будь-який його елемент банкрутом або порожнім символом. Таким чином зберігання пароля в масиві символів явно знижує ризик перехоплення пароля.

Причина 2. Рекомендації авторів

Java сама по собі (ну, через своїх творців, зрозуміло) рекомендує використовувати метод getPassword ()із класу JPasswordField, який повертає char []. Можна також спробувати застарілий (deprecated) метод 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
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ