为了账号安全,请及时绑定邮箱和手机立即绑定

Android HMAC SHA512 负字节

Android HMAC SHA512 负字节

翻阅古今 2021-06-16 17:09:07
您好,我正在尝试为需要对数据进行 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)


查看完整回答
反对 回复 2021-06-17
  • 2 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信