Java - 选择String来存储加密的密码有什么问题?

时间:2017-12-01 18:40:02

标签: java encryption passwords string-pool

我们将密码存储为java中的char数组,并找到理由。我遇到一个面试问题,说明" 如果密码加密怎么办,我们将其保存在String中,这样可以吗?或者为什么不呢?"

我能想到的是加密和解密过程涉及纯文本字符串对象,我们回到同一问题字符串中的纯文本密码。对我自己的答案不太相信,这可能是理由/理由。

2 个答案:

答案 0 :(得分:1)

这听起来像是一个安全问题。他们可能正在研究一旦使用它就会覆盖字符数组的内存。

一个不可变的字符串将在内存中保留,直到收集垃圾,然后重用内存。理论上,内存转储可以找到加密的密码,该密码可以被解密和暴露。

使用字符数组,完成后,您可以覆盖内存,使其不再可以暴露。当然,它仍然在记忆中很短的时间。

答案 1 :(得分:0)

有趣的问题。我认为不在char []上选择字符串的主要原因显然是基于“安全性”。

  1. 字符串是不可变的

    • 普通文本将在内存中可用,直到垃圾收集器执行删除它的功能。将文本留在那里直到收集者的干预是我能想到的一个主要漏洞。
  2. 从技术上讲, 日志文件安全。 例如:

    String sPsswrd = "test";

    Char[] cPsswrd = new char[]{'t','e','s','t'};

    如果在日志文件的某处打印出来,

    System.out.println("password as string: "+sPsswrd);

    System.out.println("password as Char array "+cPsswrd);

  3. 输出:

    password as string: test
    password as Char array: [@14
    

    如果密码存储为数组,密码将更安全。希望这能对可能存在的问题有所了解。