0

我正在使用 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;
}

当我将它打印到终端时,它肯定会对文本框中输入的字符串进行哈希处理,以便我可以检查。知道为什么它会给出不同的输出吗?我知道有不同的方法来散列字节或什么?

4

1 回答 1

7

您当前在 Java 中将哈希转换为八进制,而 MySQL 版本是十六进制。

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

  • 您的 MySQL 哈希似乎是33 个字符,这对于十六进制的 MD5 哈希来说数据太多了。那里发生了一些奇怪的事情。
  • 无论如何,我不会使用BigInteger将字节数组转换为十六进制;那不是它的用途。使用 Apache Commons Codec 或为十六进制转换而设计的东西。例如,这样你会得到适当的前导零,这BigInteger可能会抑制
  • 您当前的代码假定每个字符一个字节
  • 您当前的代码假定默认字符编码是合适的;我建议总是String.getBytes
  • 使用 MD5 进行密码散列是弱的;如果可能的话,更新到更合适的哈希值
于 2013-06-21T12:15:33.560 回答