2009-02-25 21 views
1

我需要在PHP中撤消以下ASP.Net過程,以便獲取票證中的用戶名和過期日期。我解密了3DES加密(下面的第3步),但我不確定接下來需要做什麼。解密字節數組後得到的字符串是什麼?我應該能夠將其轉換爲ASCII碼? (因爲它沒有)。如何在PHP中使用Forms身份驗證票證的內容

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驗證密鑰。謝謝你的幫助!

回答

2

我一直在努力,我已經設法在PHP中獲得表單身份驗證票據內容。

  1. 使用與在.Net端加密它的密鑰解密票證。爲此,我使用http://www.navioo.com/php/docs/function.mcrypt-encrypt.php

  2. 解密將填充添加到字符串的末尾,我將其刪除。

  3. 我剩下一個字符串,最後有一個20字節的SHA1哈希。最後20個字節(應該)匹配字符串的第一部分(字符串長度 - 20字節)的SHA1散列。我仍然在研究這部分,試圖找出.NET如何將字節數組轉換爲可以SHA1哈希的單個數據叢(所以我可以在PHP端執行相同的操作)。

這就是它的全部。

+1

你如何獲得用戶名進行解密的數據的? – Tarnschaf 2011-07-15 07:44:55

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字符串解碼功能)。

我只能假設不管你使用哪種解碼方法(ASCII,UTF-16等),你都不會獲取數據,除非你知道隱藏在這個本地方法中的微軟的實現。

MSDN也可能會提供一些幫助。

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

相關問題