質問
前回は十分に具体的だったとは思いません。ここに行きます:
16進数の文字列があります:
742713478fb3c36e014d004100440041004 e0041004e00000060f347d15798c9010060 6b899c5a98c9014d007900470072006f007 500700000002f0000001f7691944b9a3306 295fb5f1f57ca52090d35b50060606060606
最後の20バイトには、(理論的には)最初の部分のSHA1ハッシュが含まれている必要があります(完全な文字列-20バイト)。しかし、私には合いません。
PHPでこれを実行しようとしていますが、運はありません。試合をしてもらえますか?
チケット:
742713478fb3c36e014d004100 440041004e0041004e00000060 f347d15798c90100606b899c5a 98c9014d007900470072006f00 7500700000002f0000001f7691944b9a
オリジナルに追加されたチケットのsha1ハッシュ:
3306295fb5f1f57ca52090d35b50060606060606
チケットの私のsha1ハッシュ:
b6ecd613698ac3533b5f853bf22f6eb4afb94239
チケットの内容と保存方法は次のとおりです。 FWIW、ユーザー名などを引き出し、さまざまな区切り文字を見つけることができます。 http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals/AuthTicket2 JPG
編集済み:文字列は、このポイントの前に通過する復号化関数によって、末尾に埋め込まれることを発見しました。最後の6バイトを削除し、それに応じてチケットとハッシュで調整しました。それでも動作しませんが、私は近いです。
解決
あなたのチケットは16進文字列自体で計算されています。追加されたハッシュは、同じデータの別の表現で計算されるのでしょうか?
他のヒント
バイトと文字について混乱していると思います。
内部的に、phpは文字列内のすべての文字をバイトとして保存します。 PHPが生成するsha1ハッシュは、各バイナリ値を2つの16進文字で表す必要があるため、20バイトのバイナリデータの40文字(40バイト)の16進表記です。
これが実際の不一致の原因であるかどうかはわかりませんが、この誤解を見ると、それが関連しているかどうか疑問に思います。
最初に文字列をトリミングしてみてください。ハッシュを完全に変更する改行またはスペースを最後に付けるのは驚くほど簡単です。
このオンラインSHA1ツールによると、指定されたテキストのハッシュ(新しい行とスペース)は
b6ecd613698ac3533b5f853bf22f6eb4afb94239
アイデア:入力する文字がPHPバージョンの16進数ではないことを確認してください。
問題は、オリジナルがキー付きハッシュであることでした。 sha1()なしではなく、検証キー付きのhash_hmac()を使用する必要がありました。