【问题标题】:What are the security reasons for JPasswordField.getPassword()?JPasswordField.getPassword() 的安全原因是什么?
【发布时间】:2012-02-04 03:34:24
【问题描述】:

自 Java 1.2 起,“出于安全原因”,JPasswordField.getText() 已被弃用,鼓励使用 getPassword() 方法“以增强安全性”。

但是,通过分析堆转储 (JPasswordField instance -> model -> s -> array),我至少能够在 Oracle JRE 1.7 中获取存储在 JPasswordField 中的密码。

那么JPasswordField.getPassword()如何帮助保护密码呢?

【问题讨论】:

    标签: java security swing passwords jpasswordfield


    【解决方案1】:

    好吧,documentation 表示:

    为了更强的安全性,建议使用后将返回的字符数组清零,将每个字符设置为零。

    但是,当然,如果你使用getText 方法,你会得到一个字符串,它是不可变的,所以你不能执行同样的建议。

    【讨论】:

    • JPasswordField 本身还存储了一个 char 数组,何必呢?
    • 可以立即清除字符数组。 String 可以在未来某个不确定的时间被垃圾回收。
    • 你的意思是,我需要在使用后立即清除 JPasswordField 内容?
    • @FrozenSpider - 这是建议。我目前无法检查 - getPassword 返回的数组是您一直在查看的内部数组还是副本?
    • @Damien_The_Unbeliever 返回的数组是通过System.arraycopy(...) 创建的副本,所以看来我们需要清除两者——一个直接清除,一个通过setText(null)
    【解决方案2】:

    答案很简单。这里有一个务实的方法来解释getPassword()getText()之间的区别

    JPasswordField jt=new JPasswordField("I am a password");
    System.out.println("The text is "+jt.getText());
    System.out.println("The password is "+jt.getPassword());
    

    输出

    I am a password
    [C@1e4a47e
    

    getPassword() 方法以char[] 返回密码,而getText() 以纯文本形式返回密码,即String

    但是,如果你这样打印,

    System.out.println(new String(jt.getPassword()));
    

    这与JPasswordField 中的getText() 相当。但这并不意味着getPassword() 在内部使用getText(),然后将其转换为char 数组。

    getPassword() 方法使用非字符串 API,即Segment。然而,Segment 又是不可变的,但getPassword() 方法从Segment 中获取char 数组并返回它。

    然而,String 是不可变的,char[] 不是,char[] 被认为是非常安全的,因为它可以被清除。

    【讨论】:

      【解决方案3】:

      虽然 getPassword() 在内部使用 getText() 的安全说明

      虽然 JPasswordField 类继承了 getText 方法,但你 应该改用 getPassword 方法。不仅getText少 安全,但将来它可能会返回可见字符串(对于 例如,“**”)而不是键入的字符串。

      为了进一步增强安全性,一旦你完成了角色 getPassword 方法返回的数组,你应该设置它的每一个 元素归零。

      【讨论】:

      • 感谢您复制粘贴 stackoverflow.com/a/984063/466646 ,是的。无论如何,这不是答案,请参阅我对@Damien_The_Unbeliever 答案的评论。
      • @FrozenSpider 改变了答案-
      猜你喜欢
      • 2016-08-18
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2016-08-28
      • 2016-09-01
      • 2011-12-04
      • 2011-08-29
      • 1970-01-01
      相关资源
      最近更新 更多