PHP可以使用表单身份validation票证解密吗?

我是一名PHP开发人员,几乎不了解.NET。 .NET工作人员已经要求我将用于解密身份validation票证的.NET代码转换为PHP,以便PHP代码可以为我的应用程序设置适当的会话变量来运行。 这有可能吗? 我正盯着代码,这让我感到困惑。 我会继续尝试,如果有人能告诉我这不是浪费时间因为某种原因我甚至不知道。 谢谢你的帮助!

附加信息:我是否可以首先使用PHP获取票证?

正如Gumbo所说,你需要考虑所涉及的算法。 asp.net身份validation票证使用:

  1. 创建序列化表单身份validation票证。 创建票证的字节数组表示。
  2. 签署表单身份validation票证。 通过使用machineKey元素的validation和validationKey属性指定的算法和密钥来计算字节数组的消息validation代码(MAC)值。 默认情况下,使用SHA1算法。
  3. 加密表单身份validation票证。 已创建的第二个字节数组使用FormsAuthentication类的Encrypt方法进行加密。 Encrypt方法在内部使用machineKey元素上的decryption和decryptionKey属性指定的算法和密钥。 ASP.NET 1.1版默认使用3DES算法。 ASP.NET 2.0版默认使用Rinjdael(AES)算法。

首先,打开你的machine.config并添加一个machinekey条目。 根据aspnet 2.0的machinekey生成器中随机生成的密钥和validation密钥设置解密密钥和validation密钥。

一定要使用默认值,即。 AES和SHA1。 现在您已经拥有AES解密密钥,将其存储在某个地方,因为您将需要在php端。 在你的dot net应用程序中,进入web.config并获取表单auth cookie名称,通常类似.ASPXAUTH

现在转到PHP端。 下载并设置AES加密库,如下所示, http://phpseclib.sourceforge.net/documentation/

然后在PHP中你可以做这样的事情(这使用phpsec lib):

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); include('Crypt/AES.php'); $authCookie = $_COOKIE['_ASPXAUTH']; echo $authCookie; $aes = new Crypt_AES(); $aes->setKey('BCDCBE123654F3E365C24E0498346EB95226A307857B9BDE8EBA6198ACF7F03C'); echo $aes->decrypt($authCookie); 

现在最终出现的是首先是pm + SHA1哈希+ auth票证的字节表示。 您必须将序列化字节转换为字符串以使其可读。 其他人可以在最后一步发光吗?

来自Microsoft KB

表单身份validation票证用于告诉ASP.NET应用程序您是谁。 因此,票证构成了表单身份validation的安全性。

使用服务器的Machine.config文件的配置元素对故障单进行加密和签名。 ASP.NET 2.0使用decryptionKey和元素的新解密属性来加密表单身份validation票证。 使用decryption属性可以指定要使用的加密算法。 ASP.NET 1.1和1.0使用3DES加密,这是不可配置的。 篡改故障单值是由于未能解密服务器上的故障单而确定的。 因此,用户将被重定向到登录页面。

如果应用程序部署在Web场中,则必须确保每个服务器上的配置文件共享标记中的validationKey和decryptionKey属性的相同值,这些属性分别用于对故障单进行散列和解密。 您必须执行此操作,因为您无法保证哪个服务器将处理连续的请求。 有关FormsAuthenticationTicket加密和Web场部署注意事项的详细信息,请访问以下MSDN网站:

因此,您可以指定要遵循的加密/解密算法和密钥。 您可以在PHP中使用相同的解密逻辑。

如果您知道解密算法,您肯定可以在PHP中实现它。