0

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

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

字符串“我的密码”是​​否出现在编译的 java 类文件中?据我所知,编译源代码后,“我的密码”没有出现在我的类文件中。但我仍然不能 100% 确定我可以使用所描述的表示来存储密码。

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

编辑:如果我以描述的格式存储密钥而不是密码怎么办:“key”.toCharArray()?它会减少我的密码被黑客入侵的机会吗?

4

6 回答 6

5

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

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

于 2013-11-06T03:55:42.763 回答
2

字符数组出现在已编译二进制代码的数据部分中,与字符串相同。他们必须 - JVM 应该如何知道该数组中的内容?因此,这实际上只是“默默无闻的安全”,永远不应该这样做(并且无济于事)。

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

于 2013-11-06T03:58:21.840 回答
1

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

为了说明为什么您提出的技术不安全,请尝试编译以下文件:

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

并在命令行上:

$ javac Password.java
$ strings Password.class

您会看到该字符串存在于已编译的代码中,并且易于访问。

于 2013-11-06T04:00:48.470 回答
1

以明文形式出现的密码是不安全的,是的,它将在您的.class文件中可见。另请注意,明文密码在代码/文件/数据库中是不安全的。您应该使用良好的密码加密/解密算法来保存您的密码。

于 2013-11-06T03:57:36.910 回答
0

将密码存储为哈希可能会更好一些。看看哈希 Java

于 2013-11-06T03:56:44.163 回答
0

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

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

不。查看所有其他答案,这绝不是一个好主意。

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

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

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

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

于 2013-11-06T04:44:58.550 回答