11
votes

Console Java; Readpassword, comment une matrice protège-t-elle de la détermination de la valeur de mot de passe?

Je lisais sur le java.io.console classe dans l'un des livres de certification Java, éventuellement j'ai manqué quelque chose de fondamental d'un chapitre précédent, mais quelqu'un peut-il expliquer ci-dessous?

Il mentionne, que le lisecadpassword renvoie une matrice de caractères au lieu d'une chaîne, pour empêcher un pirate informatique de trouver cette chaîne, puis de trouver le mot de passe.

Comment est un tableau de caractères plus sûr? Si vous pouviez obtenir les valeurs dans la matrice, pourriez-vous ne pas créer de script pour boucler à travers diverses combinaisons et trouver finalement le mot de passe de toute façon?


0 commentaires

3 Réponses :


2
votes

Une chaîne est une classe immuable et lorsque le mot de passe est stocké dans une chaîne, vous n'avez aucun contrôle sur son cycle de vie, ce qui signifie qu'il peut être disponible en mémoire (et sujet à des décharges de mémoire et autres) pendant une longue période. (Même s'il n'est pas interné, où il serait en mémoire jusqu'à ce que les sorties JVM). Lorsqu'il est stocké dans un tableau de caractères, vous pouvez effacer la matrice et supprimer ainsi le mot de passe de la mémoire une fois que vous l'avez validé.


0 commentaires

13
votes

du Documentation :

L'objet de la console prend en charge la saisie de mot de passe sécurisée via sa méthode LightPassword. Cette méthode aide à sécuriser l'entrée de mot de passe de deux manières. Tout d'abord, il supprime l'écho et le mot de passe n'est donc pas visible sur l'écran de l'utilisateur. Deuxièmement, Readpassword renvoie un tableau de caractères, pas une chaîne, le mot de passe peut donc être écrasé, le retirer de la mémoire dès qu'il n'est plus nécessaire.

L'idée ici est que vous pouvez appeler Arrays.frillez (ou équivalent) sur" Blank "The Char Array dès que vous avez validé le mot de passe, et à partir de ce point, le mot de passe n'est plus stocké en mémoire. Étant donné que les chaînes sont immuables, la chaîne restera dans le tas jusqu'à ce qu'elle soit recueillie - laquelle si elle réussit à se faire interné ne sera jamais, et dans aucun autre cas, pourrait encore être "trop ​​longue". Tout ce qui est là, il est potentiellement vulnérable à renifler d'une variété de vecteurs.


0 commentaires

4
votes

C'est l'une de ces meilleures pratiques. Cela n'a pas beaucoup de sens, mais nous le faisons pour une vie facile.

Si un mot de passe est en mémoire, un débordement de lecture tampon peut permettre de lire. Ou il pourrait être sauvegardé dans une vidée de noyau ou une image hibernation. Utilisation d'un chartable [] permet de détruire les données, après une fenêtre étroite, si elle n'a pas été copiée dans une chaîne, copiée ailleurs, c'est probablement dans les tampons, la collection de déchets aime les goûts déplacer des objets, etc.

Il y a un exemple amusant en swing, où jPasswordfield fournit un moyen char [] pour lire les données, mais par exemple créera une chaîne à partir des données s'il a un auditeur d'action (qui est un moyen très courant de l'utiliser).


0 commentaires