Pourquoi ne JPasswordField.getPassword() créer une Chaîne avec le mot de passe en elle?

Swing du JPasswordField a la getPassword() méthode qui retourne un tableau de char. Ma compréhension de ce que la pile peut être remis à zéro immédiatement après l'utilisation, de sorte que vous n'avez pas sensible choses traîner dans la mémoire pour longtemps. L'ancienne façon de récupérer le mot de passe à utiliser getText(), qui renvoie un objet de type String, mais il a été abandonné.

Donc, ma question est pourquoi il est en fait utilisé par Java pendant le processus de récupération à l'aide de getPassword()??? Pour être plus clair, j'ai été le débogage mon appli de test pour autre chose**, j'ai suivi les appels et bang... getText() dans JPasswordField a été appelé et, bien sûr, un bel objet de type String avec mon mot de passe a été créé et est maintenant suspendus autour de la mémoire.

L'essayer pour vous-même:

public class PasswordTest() {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPasswordField passField = new JPasswordField();
        pass.addActionListener(new ActionListener() {
            public ActionPerformed(ActionEvent evt) {
                char[] p = passField.getPassword(); //put breakpoint
                //do something with the array
            }
        });
        frame.add(passField);
        frame.setVisible(true);
        frame.pack();
    }
}

Question subsidiaire: est-ce 'hidden' utilisation de getText() dangereux en aucune façon? Bien sûr dédié attaquant recevrez votre mot de passe s'il a compromis le système, je parle d'un moins dédié 😉

**Je suis tombé sur ce alors que je cherchais un moyen d'afficher certaines données sensibles sur un composant Swing sans l'aide d'un String objet. Apparemment, il n'y a aucun moyen de le faire, sauf si je suis prêt à réécrire une partie (tous?) de l'API Swing.. on va pas se produire.

  • Je doute de la réclamation que vous auriez besoin de réécrire le Swing API pour afficher les données sensibles. Pouvez-vous faire un composant personnalisé, qui s'étend JComponent et remplace paintComponent? Ensuite c'est à vous de savoir comment le texte est traité.
InformationsquelleAutor | 2009-06-11