PHP ile Form Kimlik Doğrulaması bilet içeriğine ulaşmak için nasıl

3 Cevap php

Ben bu yüzden bir bilet kullanıcı adı ve son kullanma tarihi alabilirsiniz PHP aşağıdaki ASP.Net işlemleri geri almak gerekir. Ben 3DES şifreleme (Adım 3) deşifre ettik ama ben bir sonraki yapmanız gereken emin değilim. Şifre çözme bir bayt dizisi sonuçları dize mi? Ben ASCII dönüştürmek gerekir? (Öyle değil çünkü).

Ne ASP.Net bileti oluşturmak için yapar:

  1. Adınızı, sona erme, diğer verileri (Ben umurumda değil ki) dizgeleştirir. Bir bayt dizisi oluşturun.
  2. SHA1 kullanarak bilet Burcu (sig son 20 bayt)
  3. 3DES (Ben şifrelenmemiş ettik ki) ile bilet şifrelemek.

Şöyle bir şey geri almak:

6E 85 A4 39 71 31 46 BB A3 F6 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 BE 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 5K 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

Ben şimdi ne yapacağım, ascii eşleşmiyor? Ben SHA1 doğrulama anahtarı var. Herhangi bir yardım için teşekkür ederiz!

3 Cevap

Ben bunu anlamaya çalışıyorum oldum, ve ben PHP form kimlik doğrulama bileti içeriğini almak başardı.

  1. . Net tarafında şifrelemek için kullanılan aynı anahtar ile bilet azalmak. Bunun için, ben kullanıyorum http://www.navioo.com/php/docs/function.mcrypt-encrypt.php. Ediyorum

  2. Şifre çözme dizenin sonuna doldurma ekler, bunu kaldırın.

  3. Ben sonunda 20 byte SHA1 karma ile bir dize ile sol. Bu son 20 bayt dize (- 20 bayt dize uzunluk) ilk bölümünün SHA1 eşleşmesi (gerekir). Ben hala NET SHA1 (yani PHP tarafında aynı şeyi yapabilirsiniz) karma bir veri tek bir yığın halinde bir bayt dizisi nasıl dönüştürür. Anlamaya çalışıyorum, bu bölümü üzerinde çalışıyorum.

Hepsi bu kadar var gerçekten.

Ben bu mümkün olduğunu sanmıyorum ...

A few pre-requisite questions:

  • Eğer doğru MachineKey değeri ve şifre çözme algoritması ile, doğru bir dize deşifre emin misiniz? Ben ASP.NET 1.0 kullanılan 3DES'i biliyorum ama yeni sürümleri genellikle varsayılan olarak AES kullanır.
  • Neden ilk etapta bu verilere erişme vardır? FormsAuthenticationTicket "kırık" olması amaçlanmıştır değildi, ve farklı bir dilden bu değerleri erişmek için gittiğini eğer kendi düzenini haddeleme düşünebilirsiniz.

Some noteworthy observations:

Gömülü in FormsAuthentication.Decrypt() için bir çağrı UnsafeNativeMethods.CookieAuthParseTicket(...). İşte imzası:

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

Bu FormsAuthenticationTicket bireysel üyelerinin içine MachineKeySection.HexStringToByteArray() (UTF-8 kullanarak dize şifresini görünen görünüşte bir işlev) döndürülen bir bayt dizisi olarak görünüyor ne ayrıştırır.

Ben sadece kullandığınız şifre çözme yöntemi olursa olsun (ASCII, UTF-16, vb) Eğer bu yöntemde yerli gizli Microsoft'un uygulamasını bilmeniz sürece verileri geri almak için gitmiyoruz varsayabiliriz.

MSDN de bazı yardım sunabilir.

Bunu yapmak isteyen kimsenin, ASP.NET tarafından kullanılan AES şifreleme 16-byte blok boyutu her zaman olduğunu unutmayın lütfen, PHP, yani MCRYPT_RIJNDAEL_128 terminoloji Mcrypt ve CBC modunu kullanır. Anahtar uzunluğu (ASP.NET varsayılan olarak 32 byte / 256 bit) verilen gerçek anahtar, PHP ile belirlenir. Ayrıca, deşifre verinin başlangıcı IV tüm sıfırlar (örneğin "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ olmadıkça bozuk haline geldi 0 \ 0 ").

Veri çözme hakkında daha fazla bilgi için, bkz: http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals.aspx