关于安全性:在java代码中将密码存储为char [] password =“my password”.toCharArray()是否安全?

Is it safe to store password in java code as char[] password = “my password”.toCharArray()?

本问题已经有最佳答案,请猛点这里访问。

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

1
char[] password ="my password".toCharArray();

字符串"我的密码"出现在编译的Java类文件中吗?据我所见,"我的密码"在我编译完源代码后不会出现在我的类文件中。但我仍然不能百分之百地确定我可以使用所描述的表示来存储密码。

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

编辑:如果我以描述的格式存储密钥而不是密码:"key".tochararray(),该怎么办?这会降低我的密码被黑客攻击的可能性吗?


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

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


字符数组出现在编译的二进制代码的数据部分,与字符串的方式相同。他们必须-还有什么其他的JVM应该知道这个数组中有什么?所以这真的只是"默默无闻的安全",这是不应该做的(也没有任何帮助)。

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


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

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

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

在命令行上:

1
2
$ javac Password.java
$ strings Password.class

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


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


你似乎问了两个不同的问题(或者至少可以这样解释)。

1)在源代码中存储密码是否安全?

不,看看其他答案,这绝对不是个好主意。

2)使用String保存密码(或其他敏感数据)是否安全?

这是一个更有趣的问题。该理论认为,由于Java池EDOCX1的1度及其不可变性,不能保证它们在内存中生存多长时间。因此,如果您将密码读取到String中,那么进程内存的堆转储很可能会在您停止使用密码后很快显示该密码。

这是一个有趣的想法,但它是否适用很大程度上取决于上下文。如果您在一个充满敌意的环境中操作,而您有充分理由相信在搜索敏感数据时,进程的内存可能会被丢弃,那么只有在char[]中存储可以通过编程删除的密码(将所有chars设置为0)才有意义。但是,在客户端应用程序和可能是服务器端应用程序中,在共享的托管环境中,您与不信任的进程共存(使您能够承受任何数量的恶意侧通道攻击),这种情况很可能发生在客户端应用程序和服务器端应用程序中。

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


最好将密码存储为哈希。看一下哈希Java