您好,我正在尝试为需要对数据进行 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();}提前致谢
2 回答
Helenr
TA贡献1780条经验 获得超4个赞
在 Java 中没有无符号类型,因此您无法避免二进制数据中的负值。这不是问题。
您遇到的一个问题是在byteArrayToString()
. toHexString()
不左填充零,因此值 0..15 不输出两个字符而只输出一个。我会使用类似的东西String.format("%02x", b)
。
添加回答
举报
0/150
提交
取消