我知道在java源代码中将密码存储为字符串是不安全的。通常,将它存储在具有char []类型的变量中是个好主意。以下列形式存储密码是否安全?
char[] password = "my password".toCharArray();
字符串“我的密码”是否出现在已编译的java类文件中? 据我所知,编译源代码后,“我的密码”没有出现在我的类文件中。但我仍然不能100%确定我可以使用描述的表示来存储密码。
我可以安全地使用这个构造,并确保密码受到保护,除非有人从源代码中获取密码吗?
编辑:如果我以所描述的格式存储密钥而不是密码怎么办:“key”.toCharArray()?它是否减少了我的密码被黑客入侵的可能性?
答案 0 :(得分:5)
没有安全的方法在源期间中存储密码。
您的代码可以阅读的任何信息,熟练的攻击者也可以阅读。
答案 1 :(得分:2)
字符数组出现在已编译二进制代码的数据部分中,与字符串相同。而且他们必须 - JVM还应该知道该阵列中的内容是什么?所以它实际上只是“默默无闻的安全”,永远不应该这样做(并没有帮助)。
更重要的是,你这样做的方式(首先创建字符串并将其转换为数组)甚至都不会模糊 - 字符串仍然是先创建的,因此也是二进制数据部分的一部分。
答案 2 :(得分:1)
以明文形式出现的密码不安全,是的,它会显示在您的.class
文件中。另请注意,明文密码在代码/文件/ db中是不安全的。您应该使用良好的密码加密/解密算法来保存密码。
答案 3 :(得分:1)
正如其他人所提到的,在代码中存储密码通常是一个非常糟糕的主意,尽管单向散列函数可以为您提供可接受的安全级别。
要说明您提议的技术不安全的原因,请尝试编译以下文件:
// Password.java
public class Password {
private String strPass = "i<3bieber";
private char[] chrPass = "belieber".toCharArray();
}
并在命令行上:
$ javac Password.java
$ strings Password.class
您将看到该字符串存在于已编译的代码中,并且易于访问。
答案 4 :(得分:0)
将密码存储为哈希可能会更好一些。看看Hashing Java
答案 5 :(得分:0)
您似乎在问两个不同的问题(或者至少可以这样解释)。
1)在源代码中存储密码是否安全?
没有。看到所有其他答案,这绝不是一个好主意。
2)使用String
来保存密码(或其他敏感数据)是否安全?
这是一个更有趣的问题。理论上,由于Java汇集String
的方式及其不变性,您无法保证它们在内存中存在多长时间。因此,如果您在String
中读取密码,则在您停止使用密码后,进程内存的堆转储可能会很好地显示该密码。
这是一个有趣的想法,但它是否适用在很大程度上取决于背景。如果您在恶劣的环境中操作,您有充分的理由相信您的进程的内存可能会被搜索到敏感数据,那么只能在char[]
中存储可以编程删除的密码(设置所有chars
到0)都有道理。但是,在客户端应用程序和可能的共享主机环境中的服务器端应用程序中,您可能只会遇到与您无法信任的流程(打开您)的情况任意数量的令人讨厌的侧通道攻击。)
在大多数情况下,避免使用字符串是没有意义的。例如,在许多Web应用程序中,您使用的框架和解析库可能会在客户端访问代码之前将客户端发送给您的文本转换为String
。在这种情况下,这一点没有实际意义。