MD5 Hashing返回的输出不同于预期

时间:2013-06-21 12:14:22

标签: java jdbc md5

我正在使用JDBC连接指示灯,我在MySQL数据库上使用MD5作为密码进行了密码 LondonWeight 。然后,我需要检查输入的密码,即 LondonWeight ,以检查它们是否匹配。但是,我的Java代码中的散列会为单词返回不同的输出。

MySQL哈希:     1274d1c52d7a5a9125bd64f1f9a26dce

Java哈希:     132310771724320562704545645352563257040366

这是我的哈希码:

private String hashPass(String pass) throws NoSuchAlgorithmException {
    MessageDigest mdEnc = MessageDigest.getInstance("MD5"); 
    mdEnc.update(pass.getBytes(), 0, pass.length());
    String md5 = new BigInteger(1, mdEnc.digest()).toString(8); // Encrypted 
    return md5;
}

它确实哈希在文本框中输入的字符串,因为我将它打印到终端,所以我可以检查。知道为什么它会产生不同的输出吗?我知道有不同的方法来散列字节或其他东西吗?

1 个答案:

答案 0 :(得分:7)

您目前正在使用Java将哈希转换为八进制,而MySQL版本则为十六进制。

这是第一个问题,但也是:

  • 您的MySQL哈希似乎是 33 个字符,这对于十六进制的MD5哈希来说太多了。那里有一些奇怪的事情。
  • 我不会使用BigInteger将字节数组转换为十六进制;这不是它的用途。使用Apache Commons Codec或设计的进行十六进制转换。例如,通过这种方式,您将获得BigInteger可能会抑制的适当前导零
  • 您当前的代码假定每个字符有一个字节
  • 您当前的代码假定默认字符编码是合适的;我建议总是String.getBytes
  • 中指定编码
  • 使用MD5进行密码散列很弱;如果可能的话,更新到更合适的哈希