2009-02-25 4 views
1

Ich muss die folgenden ASP.Net-Prozesse in PHP rückgängig machen, damit ich den Benutzernamen und das Ablaufdatum in einem Ticket bekommen kann. Ich habe die 3DES-Verschlüsselung entschlüsselt (Schritt 3 unten), aber ich bin mir nicht sicher, was ich als nächstes tun muss. Ist die Zeichenkette, die aus der Entschlüsselung resultiert, ein Byte-Array? Kann ich es in ASCII umwandeln? (Weil es nicht geht).Wie bekomme ich den Inhalt von Forms Authentication Ticket mit PHP

Was ASP.Net tut Ticket zu erstellen:

  1. Serialize Benutzername, Ablauf, andere Daten (die mich nicht interessieren). Erstellen Sie ein Byte-Array.
  2. Signieren Sie das Ticket mit SHA1 (das sig ist die letzten 20 Bytes)
  3. Verschlüsseln Sie das Ticket mit 3DES (die ich nicht entschlüsselt habe).

ich wieder etwas, das wie folgt aussieht: 75

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 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 Gleichstrom 08 59 C0 64 B6 EE 2C 5F CA ED 8B 92 1C 80 FD FF Gleichstrom 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 Gleichstrom 7B 78 F4 F8

Es wird nicht auf Ascii abgebildet, was mache ich als nächstes? Ich habe den SHA1-Validierungsschlüssel. Danke für jede Hilfe!

Antwort

2

Ich habe es ausgearbeitet, und ich habe es geschafft, die Formularauthentifizierung Ticket Inhalte in PHP zu bekommen.

  1. Entschlüsseln das Ticket mit dem gleichen Schlüssel verwendet, es auf der .NET-Seite zu verschlüsseln. Dafür verwende ich http://www.navioo.com/php/docs/function.mcrypt-encrypt.php.

  2. Die Entschlüsselung fügt Padding am Ende der Zeichenfolge, ich entferne das.

  3. Ich bin am Ende mit einer Zeichenfolge mit einem 20-Byte-SHA1-Hash verlassen. Die letzten 20 Byte (sollten) dem SHA1-Hash des ersten Teils der Zeichenfolge entsprechen (Zeichenfolgenlänge - 20 Byte). Ich arbeite immer noch an diesem Teil und versuche herauszufinden, wie .NET ein Byte-Array in einen einzigen Haufen von Daten konvertiert, die SHA1-Hashed sein können (also kann ich dasselbe auf der PHP-Seite tun).

Das ist wirklich alles, was es ist.

+1

Und wie Sie die Benutzername aus den entschlüsselten Daten erhalten? – Tarnschaf

2

Ich glaube nicht, das ist möglich ...

Einige Voraussetzung Fragen:

  • Sind Sie sicher, dass Sie die Zeichenfolge richtig entschlüsselt haben, mit dem richtigen MachineKey Wert und Entschlüsselungsalgorithmus? Ich weiß, ASP.NET 1.0 verwendet 3DES, aber neuere Versionen verwenden in der Regel AES standardmäßig.
  • Warum greifen Sie überhaupt auf diese Daten zu? Die FormsAuthenticationTicket war nicht dazu gedacht, "gebrochen" zu werden, und wenn Sie auf diese Werte aus einer anderen Sprache zugreifen würden, könnten Sie erwägen, Ihr eigenes Schema zu rollen.

einige bemerkenswerte Beobachtungen:

in FormsAuthentication.Decrypt() Begraben ist ein Aufruf an UnsafeNativeMethods.CookieAuthParseTicket(...). Hier ist die Signatur:

[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); 

Dieses analysiert, was ein Byte-Array von MachineKeySection.HexStringToByteArray() zurückgekehrt sein, sieht (anscheinend eine Funktion, die die Zeichenfolge mit UTF-8 zu dekodieren erscheint) in die einzelnen Mitglieder des FormsAuthenticationTicket.

Ich kann nur davon ausgehen, dass egal welche Dekodiermethode Sie verwenden (ASCII, UTF-16, etc.) Sie die Daten nicht zurück erhalten werden, wenn Sie die in dieser nativen Methode verborgene Implementierung von Microsoft kennen.

MSDN kann auch etwas Hilfe bieten.

1

Für alle anderen, die dies tun möchten, beachten Sie bitte, dass die von ASP.NET verwendete AES-Verschlüsselung immer eine Blockgröße von 16 Byte hat, d. H. MCRYPT_RIJNDAEL_128 in PHP mcrypt-Terminologie, und den CBC-Modus verwendet. Die Schlüssellänge (32 Byte/256 Bit nach ASP.NET Standard) wird von PHP aus dem tatsächlichen Schlüssel bestimmt. Außerdem scheint der Anfang der entschlüsselten Daten beschädigt zu sein, es sei denn, die IV ist nur Nullen (z. B. "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \" 0 \ 0 ").

Weitere Informationen zum Dekodieren der Daten finden Sie unter: http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals.aspx