質問

前回は十分に具体的だったとは思いません。ここに行きます:

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()を使用する必要がありました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top