您好,我正在嘗試為需要對(duì)數(shù)據(jù)進(jìn)行 SHA512 加密的 Api 創(chuàng)建 Http 請(qǐng)求。我在 C# 中做了同樣的例子。在 Android Java 中,我無(wú)法復(fù)制哈希并驗(yàn)證 WebApi。我認(rèn)為問(wèn)題在于mac.doFinal(byteData);正在創(chuàng)建具有負(fù)值的字節(jié)數(shù)組。在 C# 中沒(méi)有任何負(fù)面影響。這是我的代碼。請(qǐng)告訴我我做錯(cuò)了什么: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貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
在 Java 中沒(méi)有無(wú)符號(hào)類(lèi)型,因此您無(wú)法避免二進(jìn)制數(shù)據(jù)中的負(fù)值。這不是問(wèn)題。
您遇到的一個(gè)問(wèn)題是在byteArrayToString()
. toHexString()
不左填充零,因此值 0..15 不輸出兩個(gè)字符而只輸出一個(gè)。我會(huì)使用類(lèi)似的東西String.format("%02x", b)
。
添加回答
舉報(bào)
0/150
提交
取消