MySQL SHA256和Java MessageDigest SHA-256不匹配

时间:2013-06-07 22:55:52

标签: java mysql encryption comparison sha256

我一直在尝试加密项目中的一些用户密码,但我似乎无法使其正常工作。我决定使用SHA-256算法,当我使用Sha2向MySQL引入密码时(例如,256)它为加密密码添加了两个零。在Java中,我使用this来对程序中的文本进行散列但不能得到相同的结果。

    try {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest("ContrasenhaPassword".getBytes("UTF-8"));

        StringBuilder hexString = new StringBuilder();
        for (int i: hash) {
            hexString.append(Integer.toHexString(0XFF & i));
        }
        String Hashed = new String(hexString);
        System.out.println(hexString);
        System.out.println(Hashed);
        // Below, MySQL Output for SHA2('ContrasenhaPassword',256)
        System.out.println("d17bf0da90f56b8fc627bac6523ffd284aa0d82c870e1a0428274de048f49d78");
        System.out.println(Hashed.equals(hexString));
        } catch (Exception e) {
        e.printStackTrace();
        }

我得到的输出是:

        d17bf0da90f56b8fc627bac6523ffd284aa0d82c87e1a428274de048f49d78
        d17bf0da90f56b8fc627bac6523ffd284aa0d82c87e1a428274de048f49d78
        d17bf0da90f56b8fc627bac6523ffd284aa0d82c870e1a0428274de048f49d78
        false 
        BUILD SUCCESSFUL (total time: 0 seconds)

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

不同之处在于你如何将它们打印出来:

for (int i: hash) {
  hexString.append(Integer.toHexString(0XFF & i));
}

留下前导零,因此有一个字节格式为“e”而不是“0e”。可能最简单的替代方案是

for (int i: hash) {
  hexString.append(String.format("%02x", i));
}

或者,如果您可以使用Guava,那么整个过程可以通过

更简单地完成
Hashing.sha256().hashString("ContrasenhaPassword", Charsets.UTF_8).toString()

它在一行中为您提供(格式正确的)十六进制编码的SHA-256哈希。

答案 1 :(得分:1)

你不能添加缺失的零

for (int i: hash) 
{
    if(Integer.toHexString(0xFF & i).length() == 2)
        hexString.append(Integer.toHexString(0xFF & i));
    else
        hexString.append ( 0x00 + Integer.toHexString(0xFF & i));
}

对我来说似乎没问题。