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

Ada*_*ort 0 java md5 jdbc

我使用JDBC连接灯和我有字LondonWeight作为密码MySQL数据库使用MD5加密.然后,我需要检查输入的密码,即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;
}
Run Code Online (Sandbox Code Playgroud)

它肯定会散列在文本框中输入的字符串,因为我将它打印到终端,所以我可以检查.知道为什么它会提供不同的输出吗?我理解有不同的方法来散列字节或其他东西?

Jon*_*eet 7

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

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

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