Vous entendrez peut-être une telle question lors d'un entretien pour le poste Java Junior. Mais on a posé cette question à mon ami lors d'un entretien pour le poste de responsable technique.
Les
String
, et un tableau de caractères peuvent être utilisés pour stocker des données texte. Mais choisir consciemment l’un ou l’autre pour une tâche spécifique est difficile si vous n’avez pas encore rencontré une situation similaire. Cependant, comme mon ami l'a souligné, toute question liée à
String
, implique généralement une propriété spéciale des chaînes appelée immuabilité (
Immutable
), et il en a profité lors de l'interview. Examinons donc quelques raisons pour lesquelles vous devriez utiliser
char []
, et non , pour stocker votre mot de passe
String
.
Raison 1. Les chaînes sont immuables
Étant donné que les chaînes sont immuables en Java, votre mot de passe en texte brut sera disponible en mémoire jusqu'à ce que le garbage collector l'efface. Et comme
String
ils sont utilisés
String pool
de manière répétée, il existe une probabilité assez forte que le mot de passe reste longtemps en mémoire, ce qui n'est pas du tout sécurisé.
Le pool de chaînes Java est un pool ou un ensemble d'objets (chaînes) situé dans un endroit spécial - le tas. La chaîne en Java est l'un des types de données les plus courants. Ce n'est pas un type primitif, mais un objet, car il est très gourmand en ressources. Ainsi, pour stocker une chaîne de quatre caractères, vous devez allouer 56 octets de mémoire. C'est pourquoi les chaînes, comme les autres objets, sont stockées sur le tas. |
Toute personne ayant accès à un vidage mémoire peut trouver le mot de passe en texte brut, ce qui constitue une bonne raison d'utiliser un mot de passe crypté plutôt qu'en texte brut. Les chaînes étant immuables, leur contenu ne peut pas être modifié. Tout changement créera une nouvelle ligne. Mais dans le cas de
char []
, vous pouvez remplacer n'importe lequel de ses éléments par zéro ou un caractère vide. Ainsi, stocker le mot de passe dans un tableau de caractères réduit clairement le risque d’interception du mot de passe.
Raison 2. Recommandations des auteurs
Java lui-même (enfin, par l'intermédiaire de ses créateurs, bien sûr) recommande d'utiliser une méthode
getPassword ()
de la classe
JPasswordField
qui renvoie
char []
. Vous pouvez également essayer la méthode obsolète
getText ()
. Pourquoi ne pas suivre les recommandations des auteurs du langage ?
Raison 3. Imprimer
Avec un type,
String
il y a toujours un risque que le texte stocké dans la chaîne soit imprimé dans le fichier journal ou dans la console. En même temps, si vous utilisez
Array
, vous n'imprimerez pas le contenu du tableau, mais uniquement son emplacement en mémoire. Bien sûr, ce n’est pas vraiment une raison sérieuse, mais cela a quand même du sens.
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
Bien entendu, utiliser
char []
Java pour stocker des mots de passe n’est pas en soi une panacée. Vous devez prendre des précautions de sécurité, comme travailler avec des hachages et chiffrer les mots de passe plutôt que de les stocker en texte brut. Et bien sûr, supprimez-le de la mémoire immédiatement après la procédure d'authentification.
Basé sur des matériaux de Javarevisité
GO TO FULL VERSION