2009-02-25 28 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

相关问题