2

我有一个使用 .NET 4.5.2 的 MVC 应用程序。在这个应用程序中,我将 MachineKey 设置如下:

    <machineKey compatibilityMode="Framework45" validationKey="25E5749C117E4072E721DA0B8A88B052AAA821CA1D1638C10F0DBF528C19D296134A996B5FA934E1032C9BA9FBDC45EF8806153D683EF4F6C833E7BF6639C513" decryptionKey="DC7ACBAD80BC8EDBD1429F102CEC1C210604DA6C3E6421A4" validation="SHA1" decryption="AES" />

然后我运行我的 GetMachineKey 代码(它依赖于ReflectionMagic以在访问内部属性时保持反射代码简单):

    public static Tuple<string, string> GetKeys()
    {
        var mksType = typeof(MachineKeySection);
        var getAppConfigMethod = mksType.GetMethod("GetApplicationConfig", BindingFlags.NonPublic | BindingFlags.Static);
        var boxedMachineKeySection = getAppConfigMethod.Invoke(null, null);
        var machineKeySection = boxedMachineKeySection as MachineKeySection;

        var dynKeySection = machineKeySection.AsDynamic();

        var encryptionKeyBytes = (byte[])dynKeySection.DecryptionKeyInternal;
        var encryptionKeyString = string.Concat(encryptionKeyBytes.Select(b => b.ToString("X2")));
        var validationKeyBytes = (byte[])dynKeySection.ValidationKeyInternal;
        var validationKeyString = string.Concat(validationKeyBytes.Select(b => b.ToString("X2")));

        return new Tuple<string, string>(encryptionKeyString, validationKeyString);
    }

运行该代码后,我成功检索了我的 ValidationKey 和我的 DecryptionKey。伟大的!完美的!正是我在那种情况下想要的!

接下来,我将我的 MachineKey 设置为:

    <machineKey compatibilityMode="Framework45" validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" decryption="AES" />

现在,当我运行我的代码时,我再次检索我的密钥,我注意到每次生成新密钥时,验证密钥中的前四个八位字节与解密密钥中的相同。我现在已经在 12 台不同的服务器上部署了这个应用程序,并且模式是相同的(不是所有服务器上的字节都相同,但前四个八位字节总是在同一服务器的两个键上匹配)。例如,在一个实例中,我的密钥都是这样开始的:

验证码: B298BA4E 463CB2934329...

解密密钥: B298BA4E 0505BF0A9424...

所以我的问题:

为什么“随机”键在开头都有相同的字节?或者,我是否正确阅读了这些键?

PS我知道这些密钥很难获得,并且出于安全原因非常重要,我通常不应该这样做。我正在尝试创建一个技术培训演示/演示文稿,讨论负载平衡并说明为什么正确管理您的 MachineKeys 很重要。我永远不会对生产代码做这样的事情,但是很高兴在通过负载平衡器查看方程的变量时看到这些东西为了演示目的而改变。所以请不要告诉我我不应该这样做。是的,我知道。

PPS如果你看到这篇文章,你可能不应该使用我的代码。这是个坏主意!

4

1 回答 1

4

文档中

“IsolateApps 修饰符指定 ASP.NET 使用每个应用程序的应用程序 ID 为每个应用程序生成唯一的加密密钥”

因此,看起来 IsolateApps 是一种保护措施,可以防止获取相同机器密钥配置文件的不同应用程序使用相同的密钥。

实际上,前四个字节与您的 appName 的哈希码相关(因为您正在指定 IsolateApps),而其余字节来自RandomNumberGenerator.GetBytes。请参阅代码中的此处此处

正如代码所建议的,如果您有“,IsolateByAppId”,接下来的 4 个字节将是相同的

如果您删除这些“隔离”标志,您可能会得到所有随机字节。

于 2015-06-04T20:08:25.583 回答