【问题标题】:Why does JavaFx PasswordField return it contents as a String? [duplicate]为什么 JavaFx PasswordField 将其内容作为字符串返回? [复制]
【发布时间】:2015-04-28 15:33:16
【问题描述】:

我目前正在学习 JavaFX,我对 JavaFX 中的 PasswordField 没有返回密码的字符甚至字节数组的方法有点困惑。相反,我必须使用返回字符串的 getText()。

如您所见,hereswing 决定将 getText() 方法标记为已弃用,并告诉程序员改用 getPassword(),它会返回一个 char 数组。

如果我没有正确理解,那么 char 数组要安全得多,因为您可以通过将所有值设置为 0 从 RAM 中完全擦除它们。那么为什么 Oracle 决定在 JavaFx 中使用字符串?是否有一些新方法可以从堆中删除字符串?

编辑:据我所知,char 密码更省钱,因为我们可以随时删除它们(覆盖它们),而字符串不是这种情况。

【问题讨论】:

  • 听起来你说没有getPassword() 方法,只有getText() 方法,你读过的最近已弃用。您是否使用过时的 JavaFX 库?这可以解释为什么您看不到该方法可用
  • @mmcrae 不,JavaFX 8 中的 passwordField 没有 getPassword 方法,您可以在这里看到:link
  • 我不会说 char 数组更安全。无论数据类型如何,您都在 VM 的内存空间中工作。请查看此related post 及其 cmets 了解更多信息。
  • @OttPrime Char 数组更安全,因为您可以覆盖它们,这意味着密码在 ram 中只有一瞬间。
  • 如果这对您的应用程序来说是一个重要的安全问题,我的建议是创建您自己的 SecurePasswordField 类,该类不将密码存储在字符串中并将其提供给第三方ControlsFX project。如果您选择跟进,也许JavaFX development mailing list 上的某个人可以提供当前实施的原因。

标签: java string javafx password-protection


【解决方案1】:

你说的是绝对正确的,你不能依赖垃圾收集器。但是,拥有char[] 允许您以编程方式清除字符,例如:Arrays.fill(password, (char)0);

char[] 仍将存在于内存中,但内容已消失。

我同意问题的原作者,没有方法 char[] getPassword() 是不可接受的密码字段。

【讨论】:

    【解决方案2】:

    实际上,字符串数组在其基本实现中使用 char 数组。它们都存储在 VM 中,并且都可能不安全。

    如果您不想依赖垃圾收集器来清理密码并销毁痕迹,请按照 Jewelsea 在 cmets 中的建议并自己编写。

    为什么?唯一能够真正回答为什么 Java 会发生任何事情的实体是 Oracle。

    【讨论】:

    • A char[] 不是不安全的,因为可以覆盖数组的内容以防止从内存中提取密码。 (如other answer 中所述)。
    猜你喜欢
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2013-04-09
    • 2012-04-12
    • 2018-06-29
    相关资源
    最近更新 更多