比较密码时,始终存在将其保留在内存中的问题。相反,在引入密码的那一刻,我想用它的md5快照(或任何其他哈希生成函数)替换它
假设你有一个键值对String password = "Secret";
,那么将“秘密”加入到一个独特的东西的最简单方法是什么?
答案 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类生成哈希
但我认为重要的不是将整个密码存入内存 - 如果您通过某种字节流读取它,请将其直接读取到消息摘要中逐字节 - 使用更新方法消息摘要类,然后在读完调用摘要后得到结果。