2009-02-25 2 views
1

PHP에서 다음 ASP.Net 프로세스를 실행 취소해야 티켓의 사용자 이름과 만료일을 알 수 있습니다. 3DES 암호화 (아래의 3 단계)를 해독했지만 다음에해야 할 일이 확실하지 않습니다. 해독 결과 문자열이 바이트 배열입니까? 그것을 ascii로 변환 할 수 있어야합니까? (그렇지 않기 때문에).PHP로 폼 인증 티켓의 내용을 얻는 방법

  1. 직렬화 사용자 이름, 만료, (I에 대한 상관 없어) 기타 데이터 : ASP.Net 티켓을 만들기 위해 무엇을

    . 바이트 배열을 만듭니다.

  2. SHA1을 사용하여 티켓에 서명하십시오. (sig는 마지막 20 바이트입니다.)
  3. (암호화되지 않은) 3DES로 티켓을 암호화하십시오.

    6E 85 A4 39 71 31 46 BB A3의 F6은 EE A4 CE 5F 03 C8 D1 4C 97 5D 6A 52 D1 C4 82 75 (1A) 07 BE :

는 I 다시이 보이는 것을 얻을 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

아스키에 매핑되지 않습니다. 어떻게해야합니까? SHA1 유효성 검사 키가 있습니다. 어떤 도움을 주셔서 감사합니다! 나는 이것이 가능하다고 생각하지 않습니다

답변

2

나는 그것을 사용해 왔으며, PHP에서 폼 인증 티켓 내용을 얻을 수있었습니다.

  1. 닷넷 측을 암호화하는 데 사용되는 동일한 키를 사용하여 해독 티켓. 이를 위해 http://www.navioo.com/php/docs/function.mcrypt-encrypt.php을 사용하고 있습니다.

  2. 암호 해독은 문자열 끝에 패딩을 추가하고 제거합니다.

  3. 끝에 20 바이트 SHA1 해시가있는 문자열이 남았습니다. 마지막 20 바이트는 문자열의 첫 번째 부분 (문자열 길이 - 20 바이트)의 SHA1 해시와 일치해야합니다. 나는 여전히 .NET에서 바이트 배열을 SHA1 해시가 될 수있는 단일 데이터 덩어리로 변환하는 방법을 알아 내려고 노력하면서이 부분에 대해 작업하고 있습니다. 그래서 (PHP 쪽에서도 동일한 작업을 수행 할 수 있습니다.)

정말 그게 전부입니다.

+1

을 어떻게 당신은 해독 된 데이터에서 사용자 이름을받을 수 있나요 :

데이터를 디코딩에 대한 자세한 내용은? – Tarnschaf

2

...

몇 가지 전제 조건 질문 :

  • 당신이 올바른 MachineKey 값으로 제대로 문자열을 해독했는지 확인하고 해독 알고리즘? ASP.NET 1.0은 3DES를 사용하지만 최신 버전은 일반적으로 기본적으로 AES를 사용합니다.
  • 왜이 데이터에 처음 액세스합니까? FormsAuthenticationTicket은 "깨진"것이 아니며 다른 언어에서이 값에 액세스하려는 경우 자신의 구성표를 롤링하는 것이 좋습니다.

일부 주목할만한 관찰 :

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

이 바이트 배열 MachineKeySection.HexStringToByteArray()로부터 반환되는 모습 파싱 FormsAuthenticationTicket의 개별 구성원에 (UTF-8을 사용하여 문자열을 디코딩 나타나는 외관상 함수) : 여기 서명이다.

이 기본 방법에 숨겨져있는 Microsoft의 구현을 알지 못한다면 어떤 디코딩 방법 (ASCII, UTF-16 등)을 사용하더라도 데이터를 다시 얻을 수 없다고 가정 할 수 있습니다.

MSDN 또한 도움이 될 수 있습니다.

1

ASP.NET에서 사용하는 AES 암호화는 항상 PHP mcrypt 용어로 16 바이트 블록 크기 (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 \ 0 "). http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals.aspx