1

次のコードを使用してSHA2ハッシュを再現する場合:

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

それは私にバイト配列を与えます:85、-102、-22、-48、-126,100、-43,121,93,57,9,113、-116、-35,5、-85、-44、-107,114、 -24,79、-27,85、-112、-18、-13,26、-120、-96、-113、-33、-3

しかし、MySQLを介して同じハッシュを再現すると、次の文字列が表示されます:5cfe2cddbb9940fb4d8505e25ea77e763a0077693dbb01b1a6aa94f2

Javaの結果を変換して、MySQLの結果と比較できるようにするにはどうすればよいですか?

4

2 に答える 2

4

最初にDBの結果を確認してください。最初のハッシュは、実際にはSHA-256ではなくSHA-224であるように見えます。

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[]出力を16進文字列に変換する必要があります。

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
于 2012-11-11T14:08:11.600 に答える
4

Integer.toHexString(0XFF & i)に置き換える必要がありますString.format("%02x", 0XFF & i)。そうしないと、1文字の出力しか生成されませんが、2文字が必要です。

于 2016-05-05T13:56:21.243 に答える