2012-09-27 85 views
-1

我正在嘗試集成2個系統,一個使用C++和其他用途Jva來生成HMAC摘要。在Java和C++中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都不同。

這個問題怎麼解決?

感謝您的期待!

+0

用於sha功能的C++版本是什麼庫? – Eelke

+2

請回複評論和答案,親愛的用戶... –

回答

3

在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")); 
1

除了什麼李寫的,我不認爲你正在使用HMAC在所有的C++版本。它在我看來你使用SHA-?安全的消息摘要直接(如FinalDigest()方法調用暗示)。 SHA-256是部分的HMAC計算,但只是執行SHA-256絕對不會產生相同的結果。