HMAC 加密结果不同于 JUnit 测试 Spring
HMAC encryption result different from JUnit test and Spring
我的函数有一些奇怪的问题。我正在尝试从密钥获取 HMAC 加密数据。
我进行了单元测试来尝试我的算法,它运行良好。
这是代码,带有硬数据以便于测试:
public static String hmac(String parameters, String key) {
String result = "";
parameters = "PBX_SITE=1999888&PBX_RANG=32&PBX_IDENTIFIANT=2&PBX_TOTAL=1000&PBX_DEVISE=978&PBX_CMD=TEST TEST&PBX_PORTEUR=test@test.com&PBX_RETOUR=Mt:M;Ref:R;Auto:A;Erreur:E;Id:U&PBX_HASH=SHA512&PBX_TIME=2011-02-28T11:01:50+01:00&PBX_TYPEPAIEMENT=CARTE&PBX_TYPECARTE=CB&PBX_AUTOSEULE=O";
key = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
try{
final String HMAC_SHA512 = "HmacSHA512";
Mac sha512_HMAC = Mac.getInstance(HMAC_SHA512);
//pack
String input = key.length() % 2 == 0 ? key : key + "0";
StringBuilder output = new StringBuilder();
for (int i = 0; i < input.length(); i+=2) {
String str = input.substring(i, i+2);
output.append((char)Integer.parseInt(str, 16));
}
key = output.toString();
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), HMAC_SHA512);
sha512_HMAC.init(keySpec);
byte [] mac_data = sha512_HMAC.doFinal(parameters.getBytes());
//toHex
result = String.format("%040x", new BigInteger(1, mac_data)).toUpperCase();
System.out.println(result);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
System.out.println("Done");
}
return result;
}
当我用我的单元测试调用这个函数时,结果很好:
String hmac2 = AboWebUtils.hmac(parameters, key);
9D47FFC1779013D1D26F92EE1C858AD7ECE5333106D4D61892BC683F640B061A72124F72A5B7BCD445767E347F9BA8ADE9A08A36791669E32E99C17975BD24=2FC]2[=
当我从 y 网络应用程序(Spring 框架)调用此方法时,我得到了不同的结果(错误):
AboWebUtils.hmac(parameters, key);
14BC65DEC5AF3CEED21F024D6A5665F6C8BDF90F956F8D327E0382A3A7F09ACEF557A2C5CE72F32D0CA2B3FBBE344CE5D2798526817E5647210D663AEA9BB899
我不明白为什么结果不同。我正在调用相同的方法,为了测试目的甚至覆盖了参数。我应该得到相同的结果。 JUnit & Spring 不要用相同的方式或类似的方式调用方法?
感谢您的帮助:)
试试这个
byte[] output = new byte[input.length()/2];
for (int i = 0; i < input.length(); i+=2) {
String str = input.substring(i, i+2);
output[i/2] = (byte) Integer.parseInt(str, 16);
}
SecretKeySpec keySpec = new SecretKeySpec(output, HMAC_SHA512);
通过此更改,我得到了类似于您的结果 9D47FFC1779013D1D26F...
我的函数有一些奇怪的问题。我正在尝试从密钥获取 HMAC 加密数据。 我进行了单元测试来尝试我的算法,它运行良好。
这是代码,带有硬数据以便于测试:
public static String hmac(String parameters, String key) {
String result = "";
parameters = "PBX_SITE=1999888&PBX_RANG=32&PBX_IDENTIFIANT=2&PBX_TOTAL=1000&PBX_DEVISE=978&PBX_CMD=TEST TEST&PBX_PORTEUR=test@test.com&PBX_RETOUR=Mt:M;Ref:R;Auto:A;Erreur:E;Id:U&PBX_HASH=SHA512&PBX_TIME=2011-02-28T11:01:50+01:00&PBX_TYPEPAIEMENT=CARTE&PBX_TYPECARTE=CB&PBX_AUTOSEULE=O";
key = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
try{
final String HMAC_SHA512 = "HmacSHA512";
Mac sha512_HMAC = Mac.getInstance(HMAC_SHA512);
//pack
String input = key.length() % 2 == 0 ? key : key + "0";
StringBuilder output = new StringBuilder();
for (int i = 0; i < input.length(); i+=2) {
String str = input.substring(i, i+2);
output.append((char)Integer.parseInt(str, 16));
}
key = output.toString();
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), HMAC_SHA512);
sha512_HMAC.init(keySpec);
byte [] mac_data = sha512_HMAC.doFinal(parameters.getBytes());
//toHex
result = String.format("%040x", new BigInteger(1, mac_data)).toUpperCase();
System.out.println(result);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
System.out.println("Done");
}
return result;
}
当我用我的单元测试调用这个函数时,结果很好:
String hmac2 = AboWebUtils.hmac(parameters, key);
9D47FFC1779013D1D26F92EE1C858AD7ECE5333106D4D61892BC683F640B061A72124F72A5B7BCD445767E347F9BA8ADE9A08A36791669E32E99C17975BD24=2FC]2[=
当我从 y 网络应用程序(Spring 框架)调用此方法时,我得到了不同的结果(错误):
AboWebUtils.hmac(parameters, key);
14BC65DEC5AF3CEED21F024D6A5665F6C8BDF90F956F8D327E0382A3A7F09ACEF557A2C5CE72F32D0CA2B3FBBE344CE5D2798526817E5647210D663AEA9BB899
我不明白为什么结果不同。我正在调用相同的方法,为了测试目的甚至覆盖了参数。我应该得到相同的结果。 JUnit & Spring 不要用相同的方式或类似的方式调用方法?
感谢您的帮助:)
试试这个
byte[] output = new byte[input.length()/2];
for (int i = 0; i < input.length(); i+=2) {
String str = input.substring(i, i+2);
output[i/2] = (byte) Integer.parseInt(str, 16);
}
SecretKeySpec keySpec = new SecretKeySpec(output, HMAC_SHA512);
通过此更改,我得到了类似于您的结果 9D47FFC1779013D1D26F...