【问题标题】:Is Forms Authentication Ticket Decryption possible with PHP?可以使用 PHP 进行表单身份验证票证解密吗?
【发布时间】:2010-10-09 09:14:31
【问题描述】:

我是一名 PHP 开发人员,对 .NET 几乎一无所知。工作中的 .NET 人员要求我将用于解密身份验证票证的 .NET 代码翻译成 PHP,以便 PHP 代码可以为我的应用程序运行设置适当的会话变量。这甚至可能吗?我盯着代码,这让我很困惑。如果有人能告诉我这不是浪费时间,我会继续尝试,因为我什至不知道。感谢您的帮助!

附加信息:我什至可以先用 PHP 抢票吗?

【问题讨论】:

    标签: c# .net php authentication encryption


    【解决方案1】:

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

    请务必使用默认值,即。 AES 和 SHA1。 现在您有了 AES 解密密钥,请将其存储在某个地方,因为您将在 php 端需要它。 在您的 dot net 应用程序中,进入 web.config 并获取表单身份验证 cookie 名称,通常类似于 .ASPXAUTH

    现在转到 PHP 端。下载并设置一个AES加密库,就像这个,http://phpseclib.sourceforge.net/documentation/

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

    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 ticket 的字节表示。您必须将序列化的字节转换为字符串以使其可读。其他人可以照亮最后一步吗?

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        来自Microsoft KB

        表单身份验证票是 用于告诉 ASP.NET 应用程序 你是谁。因此,票正在建立 表单身份验证块 安全。

        票证经过加密和签名 使用配置 服务器的 Machine.config 元素 文件。 ASP.NET 2.0 使用 decryptionKey 和新的解密 元素的属性 加密表单身份验证 门票。解密属性让 您指定加密算法 使用。 ASP.NET 1.1 和 1.0 使用 3DES 加密,不可配置。 篡改票面价值是 由未能解密确定 服务器上的票。结果, 用户将被重定向到登录 页。

        如果应用程序部署在 Web 场,您必须确保 每个服务器上的配置文件 共享相同的值 验证密钥和解密密钥 标签中的属性, 用于散列和 分别解密票证。 你必须这样做,因为你不能 保证哪台服务器将处理 连续的请求。更多 相关信息 FormsAuthenticationTicket 加密 和 Web 场部署 考虑,请访问以下 MSDN 网站:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多