2

そのため、PHPのハッシュ関数に少し奇妙な問題があります。それは時々起こるだけで、それが私を混乱させています。基本的に、私はJavaアプリとPHPページを持っており、どちらも同じ文字列のSHA256を計算します。(一般的に)同じハッシュを計算するため、2つの間で問題は発生していません。唯一の例外は、PHPの出力がJavaの出力より1文字長い場合があることです。

私はPHPでこのコードを持っています:

$token = $_GET["token"];
$token = hash("sha256", $token."<salt>");
echo "Your token is " . $token;

99%の確率で、適切なハッシュを取得します。しかし、時々、私は次のようなものを取得します(違いを示すためにスペースが追加されています):

26be60ec9a36f217df83834939cbefa33ac798776977c1970f6c38ba1cf92e92 # PHP
26be60ec9a36f217df83834939cbefa33ac798776977c197 f6c38ba1cf92e92 # Java

ご覧のとおり、ほぼ同じです。しかし、一番上のもの(PHPによって計算されたもの)には、何らかの理由でもう1つ0があります。韻や理由はあまり気づいていませんが、確かに困惑しています。間違ったエンコーディングや間違った戻り値などを考えてみましたが、その1文字を除いて、ほとんど同じである理由を実際に説明しているものはありません。

この問題に関する助けをいただければ幸いです。

編集:余分な0がどこにあるかを強調するために、スペースは一番下のスペースにのみあります。実際のハッシュにはスペースがなく、Javaが生成するものと同じであるため、実際に有効なハッシュです。

EDIT2:それについては申し訳ありません。Notepad ++で長さを確認しましたが、通常のテキストエディタとは異なるため、長さを1つ読み間違えました。そうです、一番上のものは確かに正しいです。これは、私のJavaコードのバグであることを意味します。イグナシオの答えを探り、あなたに返事をします。

4

2 に答える 2

4

一番上のハッシュは正しい長さです。16進値が出力時にゼロで埋められなかったため、一番下のハッシュが出力されます(これはバイトのMSnであることに注意してください)。したがって、ハッシュアルゴリズムとは関係のないJavaプログラムのバグです。

>>> '%04x %02x%02x %x%x' % (0x1201, 0x12, 0x01, 0x12, 0x01)
'1201 1201 121'
于 2012-08-20T16:57:33.067 に答える
2

実際には、長さが正しくないように見えるのは2番目のハッシュです(63)。2つの異なるトークンを組み立てることによって生成され、最後のトークン(16文字である必要があります)で最初のゼロが削除される可能性がありますか?

于 2012-08-20T16:57:56.637 に答える