有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

哈希匹配Java SHA2输出与MySQL SHA2输出

当我通过以下代码复制SHA2哈希时:

MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.digest("A".getBytes("UTF-8"));

它给了我一个字节数组,它是:85,-102,-22,-48,-126100,-43121,93,57,9113,-116,-35,5,-85,-44,-107114,-24,79,-27,85,-112,-18,-13,26,-120,-96,-113,-33,-3

但当我通过MySQL复制相同的散列时,它会给我一个字符串:5cfe2cdbb9940fb4d8505e25ea77e763a0077693db01b1a6aa94f2

如何转换Java的结果以便与MySQL的结果进行比较


共 (2) 个答案

  1. # 1 楼答案

    首先查看您的DB结果—看起来您的初始哈希实际上是SHA-224而不是SHA-256:

    mysql> SELECT SHA2("A", 224);
    +                             +
    | SHA2("A", 224)                                           |
    +                             +
    | 5cfe2cddbb9940fb4d8505e25ea77e763a0077693dbb01b1a6aa94f2 |
    +                             +
    1 row in set (0.00 sec)
    

    而不是:

    mysql> SELECT SHA2("A", 256);
    +                                 +
    | SHA2("A", 256)                                                   |
    +                                 +
    | 559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd |
    +                                 +
    1 row in set (0.06 sec)
    

    从这里开始,您就进入了正确的轨道,您只需要将byte[]输出转换为十六进制字符串

    import java.security.MessageDigest;
    
    public class TestSHA256 {
    
        public static void main(String[] args) {
            try {
                MessageDigest digest = MessageDigest.getInstance("SHA-256");
                byte[] hash = digest.digest("A".getBytes("UTF-8"));
    
                StringBuilder hexString = new StringBuilder();
                for (int i: hash) {
                    hexString.append(Integer.toHexString(0XFF & i));
                }
                System.out.println(hexString);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    输出:

    559aead08264d5795d399718cdd5abd49572e84fe55590eef31a88a08fdffd
    
  2. # 2 楼答案

    Integer.toHexString(0XFF & i)必须替换为String.format("%02x", 0XFF & i),否则它只生成1个字符的输出,而需要2个字符