私は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
パラメータ):
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
私が間違っていたと私は本当に誰かが光を当てることを願っている私は把握することはできませんこれに。