您好,我正在嘗試為需要對數據進行 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
提交
取消