Я пытаюсь интегрировать 2 системы, одна из которых использует C ++, а другая использует Jva для генерации дайджеста HMAC.
Ниже приведен код C ++:
static const GUID seedGUID = { 0xd6fecf42, 0x2d1e, 0x4db9, { 0xa2, 0x73, 0xeb,
0x34, 0x13, 0xe, 0xa1, 0x37 } };
shaCheckSum.AddData((char*)&seedGUID, sizeof(seedGUID));
shaCheckSum.AddData((char*)szSeed, uiSeedLen);
shaCheckSum.AddData((char*)szStr, uiStrLen);
shaCheckSum.FinalDigest(szResult);
Сгенерированный HMAC 9B2D06D314018A5134EA1CF54D5A9F20CECC473965BD9801AAC9D4868EF39D38
szSeed составляет 0,4726005982213448
szStr является [email protected]
Ниже приведен код Java:
final String HMAC_SHA1_ALGORITHM = "HmacSha256";
final String secret = "D6FECF42-2D1E-4db9-A273-EB34130EA137";
final SecretKeySpec signingKey = new SecretKeySpec(secret.toLowerCase().getBytes(),HMAC_SHA1_ALGORITHM);
final Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(signingKey);
mac.update("0.4726005982213448".getBytes());
mac.update("[email protected]".getBytes());
final byte[] rawHmac = mac.doFinal();
for (final byte element : rawHmac)
{
result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
}
System.out.println( result);
Результат HMAC: f91b07623fea970b5f9d1f5d83f850b3a6077c0e80f42b574a01d861143eac09
Оба HMAC разные.
Как решить эту проблему?
Спасибо за внимание!
В версии C ++ вы передаете байты seedGUID
в то время как в версии Java вы передаете двоичное кодирование строкового представления guid. Вы должны создать байтовый массив в вашей версии Java:
byte[] signingKey = new byte[]{ 0xd6, 0xfe, 0xcf, 0x42, 0x2d, 0x1e, 0x4d, 0xb9, 0xa2, 0x73, 0xeb, 0x34, 0x13, 0xe, 0xa1, 0x37 };
mac.init(signingKey);
Вы также должны убедиться, что используете ту же кодировку для строк, которые вы шифруете. Ваша версия C ++, вероятно, использует символы ASCII, поэтому вы должны указать кодировку данных:
mac.update("0.4726005982213448".getBytes("US-ASCII"));
mac.update("[email protected]".getBytes("US-ASCII"));
В дополнение к тому, что написал Ли, я не думаю, что вы используете HMAC вообще в версии C ++. Мне кажется, что вы используете SHA-? защищенный дайджест сообщения (как намекнул FinalDigest()
вызов метода). SHA-256 есть часть вычисления HMAC, но просто выполнение SHA-256 определенно не приведет к тому же результату.