質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

4743閲覧

Javaとnodejsのsha256処理に差が出る

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/04/20 09:49

以下のようなnode.jsのコードでsha256の文字列を求めました。

lang

1var crypto = require('crypto'); 2 3var key = '123'; 4var msg = 'abc'; 5console.log(createHmac(key, msg)); 6 7function createHmac(key, body) { 8 var data = key + body; 9 var hmac = crypto.createHmac('sha256', data); 10 hmac = hmac.update(data); 11 return hmac.digest('hex'); 12}

Javaで同じような処理を行っても、結果が同じになりません。
Javaコードを、nodejsの結果に合わせたいのですが、どのような点に注意すればよろしいでしょうか。

Javaで検証済みのコードは以下2つなどです。

lang

1 public static String createHmac(String key, String body) { 2 String data = key+ body; 3 return org.apache.commons.codec.digest.DigestUtils.sha256Hex(data); 4 }

lang

1※投稿時に調整したため、コンパイルエラーがあったらごめんなさい 2 3 public static String createHmac(String key, String body) { 4 String data = key + body; 5 byte[] bytes = data.getBytes(); 6 7 SecretKeySpec secretKey = new SecretKeySpec(bytes, "HmacSHA256"); 8 String result = ""; 9 10 byte[] resultBytes = null; 11 try { 12 Mac hmac = Mac.getInstance(secretKey.getAlgorithm()); 13 mac.init(secretKey); 14 resultBytes = mac.doFinal(bytes); 15 result = byteToString(resultBytes); 16 17 } catch (NoSuchAlgorithmException e) { 18 } catch (InvalidKeyException e) { 19 } 20 return result; 21 } 22 private static String byteToString(byte[] bytes) { 23 StringBuffer buffer = new StringBuffer(); 24 for (int i = 0; i < bytes.length; i++) { 25 int d = bytes[i]; 26 d += (d < 0)? 256 : 0; 27 if (d < 16) { 28 buffer.append("0"); 29 } 30 buffer.append(Integer.toString(d, 16)); 31 } 32 return buffer.toString(); 33 } 34

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Javaの2番目のHmacSHA256を使った方は、ちゃんとnode.jsと同じ結果になりましたよ。
(Java8 u40で確認)

key=123, data=abcで実行した結果:
75c47f67dfa203ade378a5694ec22c4133fec02ac2f40f07420de0be6d39c744

一致しない場合のkey,dataがあれば教えてください。

あと、蛇足かもしれませんが、本来のkeyとdataを指定するところは、こうなんじゃないかと思います。

lang

1var crypto = require('crypto'); 2 3var key = '123'; 4var msg = 'abc'; 5console.log(createHmac(key, msg)); 6 7function createHmac2(key, body) { 8 var hmac = crypto.createHmac('sha256', key); // こっちはkey 9 hmac = hmac.update(body); // こっちはdata 10 return hmac.digest('hex'); 11}

lang

1public static String createHmac2(String key, String body) { 2 SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA256"); 3 try { 4 Mac mac = Mac.getInstance(secretKey.getAlgorithm()); 5 mac.init(secretKey); 6 return byteToString(mac.doFinal(body.getBytes())); 7 } catch (NoSuchAlgorithmException | InvalidKeyException e) { 8 throw new RuntimeException(e); 9 } 10}

createHmac2key=123, data=abcで実行した結果:
8f16771f9f8851b26f4d460fa17de93e2711c7e51337cb8a608a0f81e1c1b6ae

投稿2015/04/21 13:00

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問