为什么PHP的hash_hmac('sha256')给出的结果与java sha256_HMAC不同

gil*_*d s 7 php java sha256

在PHP中我有以下功能:

base64_encode(hash_hmac('sha256', $data, $secret, false));
Run Code Online (Sandbox Code Playgroud)

我正在尝试在Java中创建一个函数,它将为相同的"数据"和"秘密"参数提供相同的结果.

我试着使用这个功能:

public static String base64sha256(String data, String secret) {
    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
    sha256_HMAC.init(secret_key);
    byte[] res = sha256_HMAC.doFinal(data.getBytes());
    return Base64.encodeToString(res, Base64.NO_WRAP);
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了相同输入的不同结果


更新:此功能有效.请享用.

public static String base64sha256(String data, String secret) {
    String hash = null;
    try {
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        byte[] res = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
        hash = getHex(res);
        hash = Base64.encodeToString(hash.getBytes("UTF-8"), Base64.NO_WRAP);
    } catch (Exception e){}
    return hash;
}

static final String HEXES = "0123456789abcdef";
public static String getHex( byte [] raw ) {
    if ( raw == null ) {
        return null;
    }
    final StringBuilder hex = new StringBuilder( 2 * raw.length );
    for ( final byte b : raw ) {
        hex.append(HEXES.charAt((b & 0xF0) >> 4))
                .append(HEXES.charAt((b & 0x0F)));
    }
    return hex.toString();
}
Run Code Online (Sandbox Code Playgroud)

Eel*_*lke 5

当第四个参数为false时,php函数的输出是小写的十六进制数字。但是,您的第二个 Java 版本会生成大写的十六进制数字。要么更正大小写差异,要么您可以将 hash_hmac 的第四个参数更改为 true,它可能会与您的第一个 Java 版本匹配。