5

TransUnion Web サービスに接続しようとしていますが、アクセスするには HMAC-SHA1 署名を提供する必要があります。

この例は、TransUnion のドキュメントにあります。セキュリティ キーを使用して を
入力すると、 の 出力が作成されます。SampleIntegrationOwner2008‐11‐18T19:14:40.293ZxBy/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=");

}
4

2 に答える 2

3

これは、Base64でエンコードされたキーのように見えます。したがって、base64デコードを実行してから、HMACに渡す必要があると思います。このようなもの(説明のために私はテストしていません。エラーは読者の練習問題です):

public String getHmacMD5(String privateKey, String input) throws Exception{
    String algorithm = "HmacSHA1";
    byte[] keyBytes = Base64.decode(privateKey);
    Key key = new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm); 
    Mac mac = Mac.getInstance(algorithm);
    mac.init(key); 
    return Base64.encode(mac.doFinal(input.getBytes()));
}
于 2012-06-02T04:31:02.857 に答える
2

私が気づいたことの1つは、ハイフンが通常のハイフンではないことです。それらをコピーして貼り付けると、ASCII文字セットには含まれません。確かに言えることは、ハッシュの長さが正しいように見えるということだけです。面白いことに、正しいハイフンを入力した後でも、コードで正しい答えを生成できませんでした。しかし、関係ありません。それは問題を解決しました。ハザ!

于 2012-06-05T23:21:31.393 に答える