我需要使用SHA-256算法与MAC签署消息。我有用于生成MAC的代码,但是另一端的验证失败。 有人告诉我我要计算的值是错误的。
这是我的代码
public static byte[] calculateMAC(byte[] _aiOutBufferForMacCalculation, String key) {
try{
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] mac_data=sha256_HMAC.doFinal(_aiOutBufferForMacCalculation);
String result = "";
for (final byte element : mac_data)
{
result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
}
System.out.println("Result:[" + result + "]");
return mac_data;
} catch (Exception _exception) {
_exception.printStackTrace();
}
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
public static void main(String[] args) {
String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";
byte[] data_for_mac = hexStringToByteArray(cadena);
System.out.println(new String(data_for_mac));
byte[]mac = calculateMAC(data_for_mac,key);
}
}
我看到的结果是: 0e01a8a96b30ae0a918865d1cef898ea4f96e18680fa9aae4c5d9902090c2f81
但是期望值是: 7684024da7fe89029965ac037a1ec94b21479c91cd8495e726fec924e84b0773
我使用了两个在线工具,这些工具允许我输入十六进制字符串作为inputo来生成哈希。结果与预期相同,因此我确认我的问题。
我不知道自己在做什么或做错什么,任何人都可以帮忙吗? 谢谢
答案 0 :(得分:0)
从您的main
函数参数中,我还期望该键也是十六进制字符串。因此,您也需要为此呼叫hexStringToByteArray
。 getBytes()
方法仅返回字节,不会从十六进制字符串转换。
将calculateMAC
函数更改为以下内容:
public static byte[] calculateMAC(byte[] _aiOutBufferForMacCalculation, byte[] key) {
try{
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
...
}
您main
像这样:
public static void main(String[] args) {
String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";
byte[] data_for_mac = hexStringToByteArray(cadena);
byte[] mac_key = hexStringToByteArray(key);
// System.out.println(new String(data_for_mac)); <-- what is this????
byte[] mac = calculateMAC(data_for_mac,mac_key);
}
我进行了测试,并通过这两个小更改,您获得了预期的结果。
顺便说一句,我希望您肯定没有在此示例代码中发布所有重要的密钥,而您只是在使用一个虚拟密钥。 :D