重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

PHPから JavaServletにアクセスするシステムを作っています。
その際にパラメーターの改ざん対策にハッシュを渡すようにしたいのですが
PHPでSHA-256でハッシュ化した値と JavaでSHA-256でハッシュかした値が異なってしまいます。

PHPだとハッシュ化する際の秘密鍵を指定する項目がありますが Javaでは見つかりませんでしたので この項目が違うために結果が違うのだと予想していますが Javaが内部的に使っている秘密鍵はどこか取得できるのでしょうか?
やりたいこととしてはPHPとJavaで同じハッシュが取得できるようにしたいのですが
良い案とかやり方あったら教えてください。

◆php
string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] )

◆Java
DigestUtils.sha256Hex(string data)

わかる方いましたら教えてください。よろしくお願いいたします。

A 回答 (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. …
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の計算を自分でやる必要があります。テストベクトル通りの答えが出ないのは間違いです。
    • good
    • 0
この回答へのお礼

PHPでhashを使ったらうまくいきました。
ありがとうございました。

お礼日時:2013/11/20 10:59

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
    • good
    • 0
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ただ残念ながらアスキー文字もうまくいかないのでリンク先の件とは別物のようです。
なおMD5はPHPとJavaでどちらも同じ値になりました。

SHA-256じゃなくてMD5使う方向で話を持って行くしかないか、、、とも思いつつ 相手方の現在のシステム(Java)がSHA-256使ってるので変えるの結構大変そうだしなぁ。。。

お礼日時:2013/11/19 14:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!