猿问

Android HMAC SHA512 负字节

您好,我正在尝试为需要对数据进行 SHA512 加密的 Api 创建 Http 请求。我在 C# 中做了同样的例子。在 Android Java 中,我无法复制哈希并验证 WebApi。我认为问题在于


mac.doFinal(byteData);

正在创建具有负值的字节数组。在 C# 中没有任何负面影响。这是我的代码。请告诉我我做错了什么:


public static String calculateHMAC(String secret, String data) {

    byte[] byteSecret = secret.getBytes(StandardCharsets.UTF_8);

    byte[] byteData = data.getBytes(StandardCharsets.UTF_8);


    try {

        SecretKeySpec signingKey = new SecretKeySpec(byteSecret,    "HmacSHA512");

        Mac mac = Mac.getInstance("HmacSHA512");


        mac.init(signingKey);

        byte[] rawHmac = mac.doFinal(byteData); // -> Here Java makes rawMac with negative bytes

        return byteArrayToString(rawHmac);

    } catch (GeneralSecurityException e) {

        throw new IllegalArgumentException();

    }


}


private static String byteArrayToString(byte[] bytes) {


    StringBuilder sb = new StringBuilder();


    for(byte b : bytes){

        sb.append(Integer.toHexString(0xff & b));

    }

    return sb.toString();


}

提前致谢


翻阅古今
浏览 158回答 2
2回答

Helenr

在 Java 中没有无符号类型,因此您无法避免二进制数据中的负值。这不是问题。您遇到的一个问题是在byteArrayToString(). toHexString()不左填充零,因此值 0..15 不输出两个字符而只输出一个。我会使用类似的东西String.format("%02x", b)。
随时随地看视频慕课网APP

相关分类

Java
我要回答