- ベストアンサー
PHPとJavaでSHA256の結果を同じにする方法
- PHPから JavaServletにアクセスするシステムを作っています。ハッシュ化する際の秘密鍵の違いが原因で、PHPとJavaでSHA-256でハッシュ化した値が異なってしまいます。Javaで内部的に使っている秘密鍵を取得する方法はありますか?
- PHPとJavaで同じハッシュが取得できるようにする方法を教えてください。ハッシュ化する際の秘密鍵の違いが原因で、PHPとJavaでSHA-256でハッシュ化した値が異なってしまいます。
- PHPとJavaで同じ結果のSHA-256ハッシュを取得したいです。PHPではハッシュ化する際に秘密鍵を指定できますが、Javaで同様の秘密鍵を指定する方法はありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
SHA256の値が言語で違うというのはかなりおかしいことだと思いますが... SHA256の計算方法は仕様として決まっており、言語やOSなどにかかわらず同じ入力に対して同じ結果が出ます。次のテストベクトル通りの答えが出ないとしたら、それが壊れてます。 http://www.nsrl.nist.gov/testdata/ > ◆php > string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] ) 節子、それハッシュ値の計算やない。HMAC値の計算や。 ハッシュ値の計算をするのはこっち。 http://www.php.net/manual/ja/function.hash.php hash_hmacはHMAC値の計算に使います。 http://www.php.net/manual/ja/function.hash-hmac.php http://ja.wikipedia.org/wiki/HMAC MD5だと同じ結果が出るというのもかなり不思議ですが、偶然でしょうか? ちなみに、"abc"のSHA256を計算したらどうなりますか? 前述のNISTのページによれば、次が出てこないとダメなんですが。 "BA7816BF 8F01CFEA 414140DE 5DAE2223 B00361A3 96177A9C B410FF61 F20015AD" 改竄防止となると、もしかしてHMAC値の計算をしたかったのかもしれませんが、そうだとしたらこのテストベクトルを参照してください。 http://tools.ietf.org/html/rfc4231 前述のとおり、この結果を出さないほうが壊れてます。 なお、JavaでHMAC値を計算する方法は検索すればいくらでもサンプルコードが見つかると思います。DigestUtilsを使うとしたら、wikipediaに載っているようなHMACの計算を自分でやる必要があります。テストベクトル通りの答えが出ないのは間違いです。
その他の回答 (2)
- amino_pl
- ベストアンサー率50% (1/2)
No.2さんの通りだと僕も思います。 僕も"abc"で試しました。 System.out.println("SHA-256 = " + DigestUtils.sha256Hex("abc")); 結果は、 SHA-256 = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad です。 ちなみに僕の環境です。 ・WindowsXP Pro 32bit ・javaバージョン:1.7.0_45 ・commons-codec-1.8.jar
- amino_pl
- ベストアンサー率50% (1/2)
お礼
回答ありがとうございます。 ただ残念ながらアスキー文字もうまくいかないのでリンク先の件とは別物のようです。 なおMD5はPHPとJavaでどちらも同じ値になりました。 SHA-256じゃなくてMD5使う方向で話を持って行くしかないか、、、とも思いつつ 相手方の現在のシステム(Java)がSHA-256使ってるので変えるの結構大変そうだしなぁ。。。
お礼
PHPでhashを使ったらうまくいきました。 ありがとうございました。