0

比较密码时,总是存在将密码保存在内存中的问题。相反,在引入密码的那一刻,我想用它的 md5 快照(或任何其他哈希生成函数)替换它

假设您有一个键值对String password = "Secret";,将“秘密”打乱到独特的东西的最简单方法是什么?

4

3 回答 3

5

一旦您在 a 中获得密码String,您就已经失败了,因为您无法将其归零。它会在堆上逗留,直到另一个对象偶然覆盖它。您必须确保的第一件事是您只将密码保存在 a 中char[]并尽快将其手动归零。至于哈希,JDK 提供了对它们的支持。退房java.security.MessageDigest

于 2012-07-12T16:55:56.667 回答
2

使用 MessageDigest。像这样的东西:

MessageDigest algorithm = MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(password.getBytes());
byte bytes[] = algorithm.digest();
StringBuffer sb = new StringBuffer();
for (byte b : bytes) {
    String hex = Integer.toHexString(0xff & b);
    if(hex.length() == 1)
        sb.append('0');
    sb.append(hex);
}
result = sb.toString();

此外,如果 MD5 算法不可用,请注意 getInstance 方法可能引发的 NoSuchAlgorithmException。

于 2012-07-12T17:01:56.037 回答
0

您可以使用 Messagedigest 类来生成哈希

但是我认为重要的是不要在内存中获取整个密码-如果您是通过某种字节流读取它,则将其直接逐字节读取到消息摘要中-使用消息摘要类的更新方法,然后在您完成阅读呼叫摘要以获得结果。

于 2012-07-12T16:57:04.640 回答