为什么我的"random"机器密钥的验证密钥和解密密钥都以相同的字节开头?



我有一个MVC应用程序使用。net 4.5.2。在这个应用程序中,我设置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 463 cb2934329…

解密关键: B298BA4E 0505 bf0a9424…

我的问题是:

为什么"随机"密钥在开始时都具有相同的字节?或者,我是否正确读取了这些键?

注:我知道这些密钥很难获得,并且出于安全原因非常重要,我通常不应该这样做。我正在尝试创建一个技术培训演示/演示,讨论负载平衡,并展示为什么正确管理您的MachineKeys很重要。我从来不会对产品代码做这样的事情,但在检查负载平衡器时看到这些东西是很好的,可以看到方程式的变量被更改以用于表示目的。所以请不要对我说教说我不应该这么做。是的,我知道。

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

来自文档:

" IsolateApps修饰符指定ASP。. NET使用每个应用程序的应用程序ID "

为每个应用程序生成唯一的加密密钥。

因此,IsolateApps看起来是一个保护措施,以防止相同的密钥被不同的应用程序使用相同的machinekey配置文件。

在实践中,前四个字节与你的appName的哈希码有关(因为你指定了IsolateApps),而其余的来自RandomNumberGenerator.GetBytes。请参阅代码中的这里和这里。

正如代码所建议的,如果你有",IsolateByAppId",接下来的4个字节将是相同的。

如果你删除这些"Isolate"标志,你可能会得到所有随机字节。

最新更新