1

チケットでユーザー名と有効期限を取得できるように、PHP で次の ASP.Net プロセスを元に戻す必要があります。3DES 暗号化を復号化しましたが (以下のステップ 3)、次に何をすればよいかわかりません。復号化した結果の文字列はバイト配列ですか? それをアスキーに変換できるはずですか?(そうではないため)。

チケットを作成するために ASP.Net が行うこと:

  1. ユーザー名、有効期限、その他のデータをシリアル化します (私は気にしません)。バイト配列を作成します。
  2. SHA1 を使用してチケットに署名します (sig は最後の 20 バイトです)
  3. チケットを 3DES で暗号化します (暗号化を解除しました)。

次のようなものが返されます。

6E 85 A4 39 71 31 46 BB A3 F6 BE 1A 07 EE A4 CE 5F 03 C8 D1 4C 97 5D 6A 52 D1 C4 82 75 5E 53 06 7B 1D D2 4D BF 22 40 F7 F4 B8 8D B0 C3 EC E5 BE F7 52 C2 DF 00 7A D1 CB BC 76 4B 10 33 2D 1A B4 15 A7 BB D6 9D BF 41 69 D2 C4 43 4A 26 95 01 F2 06 AA 46 2C 96 CC AD DC 08 59 C0 64 B6 EE 2C 5F CA ED 8B 92 1C 80 FD FF DC 61 67 28 59 CB E6 71 C6 C3 72 0E D0 32 69 22 57 4E 40 2B DA 67 BA 7F F1 C5 78 BC DF 80 8C D8 F2 8B 19 E2 A4 4F 7C 8C D9 97 37 BD B5 5B 0A 66 9B DD E7 DC 7B 78 F4 F8

ascii にマップされません。次に何をすればよいですか? SHA1 検証キーを持っています。助けてくれてありがとう!

4

3 に答える 3

2

私はそれを解決していて、PHPでフォーム認証チケットの内容を取得することができました。

  1. .Net側で暗号化に使用したのと同じキーでチケットを復号化します。このために、私はhttp://www.navioo.com/php/docs/function.mcrypt-encrypt.phpを使用しています。

  2. 復号化により、文字列の最後にパディングが追加されます。これを削除します。

  3. 最後に20バイトのSHA1ハッシュが付いた文字列が残っています。これらの最後の20バイト(必要)は、文字列の最初の部分のSHA1ハッシュと一致します(文字列の長さ-20バイト)。私はまだこの部分に取り組んでおり、.NETがバイト配列をSHA1ハッシュ可能な単一のデータの塊に変換する方法を理解しようとしています(PHP側でも同じことができます)。

それが本当にすべてです。

于 2009-03-06T13:27:13.340 に答える
2

これはありえないと思います...

いくつかの前提条件の質問:

  • MachineKey正しい値と復号化アルゴリズムを使用して、文字列を正しく復号化しましたか? ASP.NET 1.0 が 3DES を使用していたことは知っていますが、新しいバージョンでは通常、デフォルトで AES が使用されます。
  • そもそもなぜこのデータにアクセスしているのですか? はFormsAuthenticationTicket「壊れる」ことを意図していませんでした。別の言語からこれらの値にアクセスする場合は、独自のスキームを展開することを検討してください。

いくつかの注目すべき所見:

Buriedin FormsAuthentication.Decrypt()は への呼び出しUnsafeNativeMethods.CookieAuthParseTicket(...)です。署名は次のとおりです。

[DllImport("webengine.dll", CharSet=CharSet.Unicode)]
internal static extern int CookieAuthParseTicket(byte[] pData, int iDataLen, StringBuilder szName, int iNameLen, StringBuilder szData, int iUserDataLen, StringBuilder szPath, int iPathLen, byte[] pBytes, long[] pDates);

これは、(明らかに UTF-8 を使用して文字列をデコードするように見える関数) から返されたバイト配列のように見えるものMachineKeySection.HexStringToByteArray()を の個々のメンバーに解析しFormsAuthenticationTicketます。

使用するデコード方法 (ASCII、UTF-16 など) に関係なく、このネイティブ メソッドに隠されている Microsoft の実装を知らない限り、データを取得することはできないと思います。

MSDNもいくつかのヘルプを提供する場合があります。

于 2009-02-25T20:48:36.817 に答える
1

これを実行したい他の人のために、ASP.NETで使用されるAES暗号化は常に16バイトのブロックサイズ、つまりPHP mcrypt用語ではMCRYPT_RIJNDAEL_128であり、CBCモードを使用することに注意してください。キーの長さ(ASP.NETのデフォルトでは32バイト/ 256ビット)は、提供された実際のキーからPHPによって決定されます。また、IVがすべてゼロでない限り、復号化されたデータの先頭が破損しているようです(つまり、 "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 ")。

データのデコードの詳細については、http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals.aspxを参照してください。

于 2010-08-18T13:10:48.430 に答える