2016-09-28 16 views
1

私はnode.jsコードのいくつかをJavaに変換することを任されています。私は途中でうまくいくと思うが、今はちょっと固まっている。メソッドの出力が一致していないようです。HMAC-SHA1をnode.jsからJavaに変換する

私がやっていることは、クエリ文字列に基づいてSHA-1署名を作成することです。このクエリ文字列には、クエリ関連のデータ(この質問には関係ありません)とAPIキーが含まれています。

重要

  • Node.jsの中api_secret文字列は、JavaでConfig.API_SECRETに相当します。
  • 例クエリ文字列(これらはNode.jsのJavaプログラムに等しい):
    /events?festival=imaginate&pretty=1&size=100&from=0&key=SOME_KEY

実際のコードSHA-1 HMACはnodejsに次のように初期化される

const hmac = crypto.createHmac('sha1', api_secret); 

Javaで次のようにSHA-1のMACが初期化される:

final SecretKeySpec secretKeySpec = new SecretKeySpec(Config.API_SECRET.getBytes("UTF-8"), "HmacSHA1"); 
final Mac hmac = Mac.getInstance("HmacSHA1"); 
hmac.init(secretKeySpec); 

次に、Node.jsのプログラムのようなHMACを更新する(上記のようにqueryパラメータである):

hmac.update(query, 'ascii'); 

私はこのようなJavaで複製(queryパラメータがNode.jsのに等しいですqueryパラメータ):

0:

hmac.update(query.getBytes("US-ASCII")); 

最後に、バイト列は、Node.jsのプログラムにおけるようなSHA-1ハッシュに変換されます。

私は、Javaへの正確な翻訳を見つけることができませんでしたが、これは、私は同じことを行いだと思う私の試みであった:

進関数にバイト配列

public static String byteArrayToHex(byte[] a) { 
    StringBuilder sb = new StringBuilder(a.length * 2); 
    for(byte b: a) 
     sb.append(String.format("%02x", b & 0xff)); 
    return sb.toString(); 
} 

実際使い方

byte[] result = hmac.doFinal(); 
MessageDigest md = MessageDigest.getInstance("SHA-1"); 
String sha1Hash = byteArrayToHex(md.digest(result)); 

私は混乱してしまいますどこただし、これはあります。 Node.jsのプログラムは、このハッシュを返します。 18cf4fce7bd6163c64d3b2ea8d935b0f16720fe3

をしかし、私のJavaプログラムは、出力として、このハッシュを与える: f65f8738cce89134dc73709e3353d94c83ccf1fb

私が間違っていたと私は本当に誰かが光を当てることを願っている私は把握することはできませんこれに。

答えて

0

私はそれを理解しました!

私は1つの不必要なステップを行っていました。

この行:

byte[] result = mac.doFinal(); 

既に署名ハッシュを含んでいました。そのバイト配列をバイト配列のダイジェストではなく、16進文字列に変換する必要がありました。

ので、作業コードは単純だった:

byte[] result = mac.doFinal(); 
return byteArrayToHex(result); 
関連する問題