Java 是否有JPasswordField的替代方案?

Java 是否有JPasswordField的替代方案?,java,swing,passwords,Java,Swing,Passwords,键入密码短语时,如 yeast bulk seize is shows pain 每个人都能听到敲击空格键的声音,因此在密码字段中显示空格似乎也是合乎逻辑的。所以我想要能展示的东西 ***** **** ***** ** ***** **** 而不是 ****************************** 这将使打字更容易,同时几乎不会降低安全性 更新 在更新Riduidel的评论之前,请三思。当“现在是以明文显示大多数密码的时候了”,那么显示一小部分密码也必须是正确的。特别是显示

键入密码短语时,如

yeast bulk seize is shows pain
每个人都能听到敲击空格键的声音,因此在密码字段中显示空格似乎也是合乎逻辑的。所以我想要能展示的东西

***** **** ***** ** ***** ****
而不是

******************************
这将使打字更容易,同时几乎不会降低安全性


更新 在更新Riduidel的评论之前,请三思。当“现在是以明文显示大多数密码的时候了”,那么显示一小部分密码也必须是正确的。特别是显示一个只需聆听即可捕获的部分。

我们认为这只是简单地覆盖渲染器组件,但情况似乎并非如此

因此,您不必更改渲染器(就像
JTextField
有这样一个组件时的情况一样),而必须使用一个带有两个字符串的
JTextField

  • 用户编写的密码文本
  • 显示的密码

  • 您必须确保所有的
    文档
    修改方法都会更改密码文本,而所有呈现方法都会使用显示的密码文本。

    这里有一个变体,用于使密码在预定义的时间内可见:例如,三秒钟

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;
    import javax.swing.JPasswordField;
    import javax.swing.Timer;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    
    /** @see http://stackoverflow.com/questions/5339702 */
    public class PasswordTest {
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGui();
                }
            });
        }
    
        private static void createAndShowGui() {
            JFrame jf = new JFrame("Test Password");
            JPasswordField jpwd = new JPasswordField();
            TimedPasswordListener tpl = new TimedPasswordListener(jpwd);
            jpwd.getDocument().addDocumentListener(tpl);
            jf.add(jpwd);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setLocationRelativeTo(null);
            jf.pack();
            jf.setVisible(true);
        }
    }
    
    class TimedPasswordListener implements DocumentListener, ActionListener {
    
        private Timer timer = new Timer(3000, this);
        private char echoChar;
        private JPasswordField pwf;
    
        public TimedPasswordListener(JPasswordField jp) {
            pwf = jp;
            timer.setRepeats(false);
        }
    
        public void insertUpdate(DocumentEvent e) {
            showText(e);
        }
    
        public void removeUpdate(DocumentEvent e) {
            showText(e);
        }
    
        public void changedUpdate(DocumentEvent e) {}
    
        public void showText(DocumentEvent e) {
            if (0 != pwf.getEchoChar()) {
                echoChar = pwf.getEchoChar();
            }
            pwf.setEchoChar((char) 0);
            timer.restart();
        }
    
        public void actionPerformed(ActionEvent e) {
            pwf.setEchoChar(echoChar);
        }
    }
    

    几乎没有?我的脚!由于使用的原因,``(空白)字符的存在显著提高了密码质量。揭示这个字符会大大增加搜索空间,因此破解密码的时间也会大大降低安全性。1。空间只是另一个角色。2.3.那些能听到你敲击空格键的人并不是想窃取你密码的人。在我看来,这绝对不值得付出努力。事实上,我看不到任何附加值。但这当然是你的时髦。@Matt:我以前读过那篇文章,我认为这是一个相当狭隘的观点。如果你不同意,考虑进入你的密码,同时连接到一个投影仪与50人在房间里。不管他们是否想偷你的密码,现在他们甚至都不找就知道了,我很抱歉,但我并不完全信任所有人。我绝对不喜欢一个产品,它至少没有给我一个掩蔽它的选择。我个人喜欢大多数WLAN密码输入的工作方式,允许您关闭屏蔽。至于密码屏蔽,请参阅@如果有人能听到空间,为什么他们不应该看到它呢???如果有人看到像这样的密码短语中的空格,他们可以干脆放弃(除非他们为NSA:D工作)。有很多不同之处,尤其是JPasswordField没有为密码创建任何字符串,而是使用char[]。这对于安全性非常重要,因为您可以清除char[]而不是String。注意:这种方法不能解决此问题中提出的其他合法安全问题。特别是,它可能会在内存中留下一段不确定的时间。@maaartinus:说得好。该方法无法提高超出其范围的安全性;但据我所知,这并没有让事情变得更糟。更多