2

アプリでは、以下を使用してJavaでSHA1Hmacを計算しています。

SecretKey key = new SecretKeySpec(secret, "HmacSHA1");
Mac m = Mac.getInstance("HmacSHA1");
m.init(key);
byte[] hmac = m.doFinal(data);

その後、hmacはC#で(スマートカード上で)次を使用して検証されます。

  HMACSHA1 hmacSha = new HMACSHA1(secret);
  hmacSha.Initialize();
  byte[] hmac = hmacSha.ComputeHash(data);

ただし、結果は同じではありません。私は何か重要なことを見落としましたか?

入力は同じようです。ここにいくつかのサンプル入力があります:

Data: 546573746461746131323341fa3c35
Key: 6d795472616e73616374696f6e536563726574

Result Java: 37dbde318b5e88acbd846775e38b08fe4d15dac6
Result C#:   dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9

両方のプラットフォームに独自のhmacsha1を実装してもかまいませんが、既存のものを使用します。

ありがとう!

4

1 に答える 1

5

このJavaコードで:

static byte[] doHMAC(byte[] data, byte[] secret)
{
    SecretKey key = new SecretKeySpec(secret, "HmacSHA1");
    Mac m = Mac.getInstance("HmacSHA1");
    m.init(key);
    return m.doFinal(data);
}

それから私dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9はあなたがあなたのC#実装から持っているものを手に入れます。また、私は自分のHMACとSHA-1の実装(Java)に関してその価値を検証し、その結果も得ています。

Javaコードに欠陥があるようですが、表示されている部分にはm.init(secret)ありません(コンパイルされないものを除いて、コンパイルする必要がありますm.init(key))。私のコードが示すように、HMAC / SHA-1のJava実装は正しく、適切に呼び出します。私の推測では、あなたは正しいデータやキーを入力していません。

(SunのJDK 1.6.0_16を使用しています)

于 2010-04-19T14:05:03.980 に答える