Java MessageDigest结果不会保持不变

时间:2010-05-18 14:56:10

标签: java authentication encryption

我有这个函数用于加密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();
}

3 个答案:

答案 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[])来比较摘要。