在java代码中将密码存储为char[]password=“my password”.toCharArray()安全吗?

在java代码中将密码存储为char[]password=“my password”.toCharArray()安全吗?,java,security,Java,Security,我知道在java源代码中以字符串形式存储密码是不安全的。通常,最好将其存储在具有char[]类型的变量中。以以下形式存储密码是否安全 char[] password = "my password".toCharArray(); 字符串“我的密码”是否显示在已编译的java类文件中? 据我所知,在编译源代码后,我的密码不会出现在我的类文件中。但我仍然不能100%确定是否可以使用描述的表示来存储密码 我是否可以安全地使用这个结构并确保密码受到保护,除非有人从源代码中获取密码 编辑:如果我以所述格式

我知道在java源代码中以字符串形式存储密码是不安全的。通常,最好将其存储在具有char[]类型的变量中。以以下形式存储密码是否安全

char[] password = "my password".toCharArray();
字符串“我的密码”是否显示在已编译的java类文件中? 据我所知,在编译源代码后,我的密码不会出现在我的类文件中。但我仍然不能100%确定是否可以使用描述的表示来存储密码

我是否可以安全地使用这个结构并确保密码受到保护,除非有人从源代码中获取密码


编辑:如果我以所述格式存储密钥而不是密码:key.toCharArray,该怎么办?这会降低我的密码被黑客攻击的几率吗

没有安全的方法将密码存储在source,period中


您的代码可以读取的任何信息,熟练的攻击者也可以读取。

最好将密码存储为散列。请看一下出现在明文中的密码是不安全的,是的,它将在您的.class文件中可见。还要注意,明文密码在code/file/db中是不安全的。您应该使用一个好的密码加密/解密算法来保存密码。

字符数组出现在已编译二进制代码的数据部分,与字符串一样。他们必须——否则JVM怎么知道数组中有什么?因此,这实际上只是默默无闻的安全,这是永远不应该做的,也无助于任何事情


更重要的是,您首先创建字符串并将其转换为数组的方式甚至不会使事情变得模糊-字符串仍然是首先创建的,因此是二进制文件数据部分的一部分。

正如其他人所提到的,在代码中存储密码通常是一个非常糟糕的主意,尽管单向散列函数可以为您提供可接受的安全级别

要演示您提出的技术不安全的原因,请尝试编译以下文件:

// Password.java
public class Password {
  private String strPass = "i<3bieber";
  private char[] chrPass = "belieber".toCharArray();
}

您将看到字符串出现在编译后的代码中,并且易于访问。

您似乎在问两个不同的问题,或者至少可以这样解释它

1在源代码中存储密码安全吗

不,看看其他答案,这从来都不是个好主意

2使用字符串保存密码或其他敏感数据是否安全

这是一个更有趣的问题。理论上,由于Java池字符串的方式及其不变性,您无法保证它们在内存中的生存时间。所以,若您将密码读入字符串,在您停止使用密码后,进程内存的堆转储可能会很好地显示该密码

这是一个有趣的想法,但它是否适用在很大程度上取决于上下文。如果您在一个敌对的环境中运行,您有充分的理由相信您的进程的内存可能会在搜索敏感数据时被转储,那么只有将密码存储在可以通过编程删除的char[]中并将所有char设置为0才有意义。然而,只有在共享托管环境中的客户端应用程序和可能的服务器端应用程序中才可能出现这种情况,在共享托管环境中,您与您无法信任的进程位于同一位置,从而使您面临任何数量的恶意端通道攻击


但在大多数情况下,避免使用字符串是没有意义的。例如,在许多web应用程序中,您使用的框架和解析库可能会在客户端发送给您的文本到达您的代码之前将其转换为字符串。在这种情况下,这一点是没有意义的。

在字符串文本上调用函数并不能神奇地使字符串文本更安全。密钥应该是什么?哦,顺便问一下:您从哪里得到的?将其存储为数组是个好主意?“好吧,那没用,看看下面我的答案——所以我很好奇你是从哪里得到的”。@JohannesH。我使用以下方法:@JohannesH。这是另一个链接:
$ javac Password.java
$ strings Password.class