Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaFXPasswordField以字符串形式返回其内容?_Java_String_Javafx_Password Protection - Fatal编程技术网

为什么JavaFXPasswordField以字符串形式返回其内容?

为什么JavaFXPasswordField以字符串形式返回其内容?,java,string,javafx,password-protection,Java,String,Javafx,Password Protection,我目前正在学习JavaFX,对于JavaFX中的PasswordField没有返回密码字符甚至字节数组的方法这一事实,我有点困惑。相反,我必须使用getText()返回字符串 正如您所看到的,swing决定将getText()方法标记为非擦洗,并告诉程序员改用getPassword(),它返回一个字符数组 如果我正确地取消读取,那么字符数组就安全得多,因为通过将所有值设置为0,可以完全从RAM中删除它们。那么为什么Oracle决定在JavaFx中使用字符串呢?有什么新方法可以从堆中删除字符串吗

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

正如您所看到的,swing决定将getText()方法标记为非擦洗,并告诉程序员改用getPassword(),它返回一个字符数组

如果我正确地取消读取,那么字符数组就安全得多,因为通过将所有值设置为0,可以完全从RAM中删除它们。那么为什么Oracle决定在JavaFx中使用字符串呢?有什么新方法可以从堆中删除字符串吗


编辑:据我所知,字符密码是非常节省的,因为我们可以随时删除它们(覆盖它们),而字符串则不是这样。

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

如果您不想依靠垃圾收集器来清理密码和销毁痕迹,请按照jewelsea在评论中的建议做,并编写自己的


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

你说的绝对正确,你不能依赖垃圾收集器。但是,使用
char[]
可以通过编程方式清除字符,例如:
Arrays.fill(password,(char)0)

字符[
]仍将存在于内存中,但内容已消失


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

听起来好像你说没有
getPassword()
方法,只有你最近读过的
getText()
方法被弃用了。您使用的是过时的JavaFX库吗?这可以解释为什么你没有看到这种方法available@mmcrae不,JavaFX8中的passwordField没有getPassword方法,正如您在这里看到的:我不会说char数组更安全。无论数据类型如何,您都在VM的内存空间中工作。有关详细信息,请查看此文件及其注释。@素数字符数组更安全,因为您可以覆盖它们,这意味着密码仅在ram中停留一秒钟。如果这是应用程序的一个重要安全问题,我的建议是创建自己的SecurePasswordField类,该类不以字符串形式存储密码,并将其提供给第三方。如果您选择继续,可能会有人提供当前实现的原因。
char[]
不是不安全的,因为可以覆盖数组的内容以防止从内存中提取密码。(如本节所述)。