如何争夺一个字符串?

时间:2012-07-12 16:52:26

标签: java cryptography

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

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

3 个答案:

答案 0 :(得分:5)

只要您拥有String中的密码,您就已经失败了,因为您无法将其归零。它将在堆上停留,直到另一个对象偶然覆盖它。您必须首先确保的是,您只需将密码保存在char[]中,并尽快将其手动归零。至于哈希,JDK会为它们提供支持。查看java.security.MessageDigest

答案 1 :(得分: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。

答案 2 :(得分:0)

您可以使用Messagedigest类生成哈希

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