我有这个函数用于加密Java中的密码,但不知怎的,当我打电话时 MessageDigest,每次返回不同的结果,即使我用相同的密码调用它。我想知道我是否以某种方式错误地初始化它。
public String encrypt (String password) {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.reset();
md.update(password.getBytes(Charset.forName("utf-8")),0,password.length());
String res = md.digest().toString();
}
答案 0 :(得分:3)
这个简单的代码会产生三种不同的结果:
MessageDigest digest = MessageDigest.getInstance("MD5");
System.out.println("test1 ");
System.out.println(digest.digest("test".getBytes("UTF-8")));
Thread.sleep(10000);
System.out.println("test2 ");
System.out.println(digest.digest("test".getBytes("UTF-8")));
Thread.sleep(10000);
System.out.println("test3 ");
System.out.println(digest.digest("test".getBytes("UTF-8")));
答案 1 :(得分:1)
.toString()
上的byte[]
方法是.digest()
的返回值,它只是为您提供数组的表示,而不是其内容。
请参阅this answer,了解如何将字节数组转换为十六进制字符串。
另一种方法是使用Arrays.toString(byte[]),尽管这可能不会为您提供所需的格式。
答案 2 :(得分:1)
您可以更改方法签名:
public byte[] encrypt (String password) {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.reset();
md.update(password.getBytes(Charset.forName("utf-8")), 0, password.length());
return md.digest();
}
...并使用Arrays.equals(byte[], byte[])
来比较摘要。