JavaRush /Blog Java /Random-FR /Q&R : Pourquoi est-il préférable de stocker un mot de pas...

Q&R : Pourquoi est-il préférable de stocker un mot de passe en Java dans un tableau de caractères plutôt que dans une chaîne ?

Publié dans le groupe Random-FR
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.
Q&R : Pourquoi est-il préférable de stocker un mot de passe en Java dans un tableau de caractères plutôt que dans une chaîne ?  - 1
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 Stringils sont utilisés String poolde 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 JPasswordFieldqui 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, Stringil 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é
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION