为什么我的 "random" MachineKey 的验证密钥和解密密钥都以相同的字节开头?
Why do my "random" MachineKey's Validation Key and Decryption Key both start with the same bytes?
我有一个使用 .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 个不同的服务器上部署了这个应用程序,模式是相同的(所有服务器上的字节不同,但前四个八位字节在同一服务器的两个密钥上总是匹配)。例如,在一个实例中,我的密钥都是这样开头的:
验证密钥: B298BA4E463CB2934329...
解密密钥: B298BA4E0505BF0A9424...
所以我的问题是:
为什么 "random" 键的开头字节相同?或者,我是否正确读取了这些密钥?
P.S. 我知道这些钥匙很难拿到,而且出于安全原因非常重要,我通常不应该这样做。我正在尝试创建一个技术培训 demo/presentation,讨论负载平衡并展示为什么正确管理 MachineKeys 很重要。我永远不会对生产代码做这样的事情,但很高兴在通过负载平衡器查看方程式的变量时看到这些东西被更改以用于演示目的。所以请不要告诉我我不应该这样做。是的,我知道。
P.P.S. 如果你遇到这个 post,你可能不应该使用我的代码。这是个坏主意!
"The IsolateApps modifier specifies that ASP.NET generates a unique encrypted key for each application using the application ID of each application"
因此,看起来 IsolateApps 是一种保护措施,可以防止不同的应用程序使用相同的密钥,这些应用程序使用相同的机器密钥配置文件。
实际上,前四个字节与您的 appName 的哈希码相关(代码中的since you are specifying IsolateApps) while the rest are coming from RandomNumberGenerator.GetBytes. See here and here。
根据代码的建议,如果您有“,IsolateByAppId”,the next 4 bytes would be the same。
如果删除这些 "Isolate" 标志,您可能会得到所有随机字节。
我有一个使用 .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 个不同的服务器上部署了这个应用程序,模式是相同的(所有服务器上的字节不同,但前四个八位字节在同一服务器的两个密钥上总是匹配)。例如,在一个实例中,我的密钥都是这样开头的:
验证密钥: B298BA4E463CB2934329...
解密密钥: B298BA4E0505BF0A9424...
所以我的问题是:
为什么 "random" 键的开头字节相同?或者,我是否正确读取了这些密钥?
P.S. 我知道这些钥匙很难拿到,而且出于安全原因非常重要,我通常不应该这样做。我正在尝试创建一个技术培训 demo/presentation,讨论负载平衡并展示为什么正确管理 MachineKeys 很重要。我永远不会对生产代码做这样的事情,但很高兴在通过负载平衡器查看方程式的变量时看到这些东西被更改以用于演示目的。所以请不要告诉我我不应该这样做。是的,我知道。
P.P.S. 如果你遇到这个 post,你可能不应该使用我的代码。这是个坏主意!
"The IsolateApps modifier specifies that ASP.NET generates a unique encrypted key for each application using the application ID of each application"
因此,看起来 IsolateApps 是一种保护措施,可以防止不同的应用程序使用相同的密钥,这些应用程序使用相同的机器密钥配置文件。
实际上,前四个字节与您的 appName 的哈希码相关(代码中的since you are specifying IsolateApps) while the rest are coming from RandomNumberGenerator.GetBytes. See here and here。
根据代码的建议,如果您有“,IsolateByAppId”,the next 4 bytes would be the same。
如果删除这些 "Isolate" 标志,您可能会得到所有随机字节。