我想與TransUnion Web服務接口,我需要提供一個HMAC-SHA1簽名來訪問它。在Java中的HMAC SHA1簽名
這個例子是環聯文檔中:
安全輸入的SampleIntegrationOwner2008‐11‐18T19:14:40.293Z
鍵xBy/2CLudnBJOxOtDhDRnsDYq9HTuDVr2uCs3FMzoxXEA/Od9tOuwSC70+mIfpjeG68ZGm/PrxFf/s/CzwxF4Q==
創建的/UhwvT/kY9HxiXaOjpIc/BarBkc=
輸出。
鑑於數據和密鑰,我無法在Java中獲得相同的結果。我已經嘗試了幾種在線計算器,並且他們都沒有返回這個結果。他們的文檔中的示例是不正確的,還是我沒有正確處理這些字符串?
這裏是我目前正與代碼:
public static String calcShaHash (String data, String key) {
String HMAC_SHA1_ALGORITHM = "HmacSHA1";
String result = null;
try {
Key signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);
Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes());
result = Base64.encodeBase64String(rawHmac);
}
catch (Exception e) {
e.printStackTrace();
}
return result;
}
這裏是我的單元測試代碼:
@Test
public void testCalcShaHash() {
String data = "SampleIntegrationOwner2008-11-18T19:14:40.293Z";
String key = "xBy/2CLudnBJOxOtDhDRnsDYq9HTuDVr2uCs3FMzoxXEA/Od9tOuwSC70+mIfpjeG68ZGm/PrxFf/s/CzwxF4Q==";
String result = Utils.calcShaHash(data, key);
assertEquals(result, "/UhwvT/kY9HxiXaOjpIc/BarBkc=");
}
從文檔的更大的摘錄可能會有所幫助。我注意到的一件事是連字符不是正常的連字符。如果您複製並粘貼它們,它們不在ASCII字符集中。我可以肯定地說哈希長度顯示正確。 –
@John Watts - 你對破折號的評論是正確的。我複製並粘貼來自Word文檔的文本。破折號不是標準的ASCII字符。通過使用正常破折號,結果是正確的,無需解碼密鑰。請添加您的評論作爲答案。 – Shane