2015-06-04 69 views
2

我有一個使用.NET 4.5.2的MVC應用程序。在這個程序,我將machineKey如下:爲什麼我的「隨機」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 ...

所以我的問題:

爲什麼「隨機」鍵在開始時都有相同的字節?或者,我是否正確讀取這些密鑰?

P.S.我知道這些密鑰很難達到目的,並且出於安全原因非常重要,我通常不應該這樣做。我正在嘗試創建一個關於負載平衡的技術培訓演示/演示,並說明爲什麼正確管理您的MachineKeys非常重要。我絕對不會用生產代碼來做這樣的事情,但當通過負載均衡器查看爲演示目的而改變的等式的變量時,很高興看到這些事情。所以請不要告訴我我不應該這樣做。是的我知道。

P.P.S.如果你遇到這個帖子,你可能不應該使用我的代碼。這是一個壞主意!

回答

4

the documentation

「的IsolateApps修飾符指定ASP.NET生成每個應用程序中使用的每個應用程序的應用程序ID唯一的加密密鑰」

因此,它看起來像IsolateApps是防止相同的密鑰被不同的應用程序使用的保護措施,這些應用程序來源於同一個machinekey配置文件。

實際上,前四個字節與appName的散列碼有關(since you are specifying IsolateApps),其餘的來自RandomNumberGenerator.GetBytes。請參閱代碼中的herehere

正如代碼所示,如​​果您有「,IsolateByAppId」,the next 4 bytes would be the same

如果您刪除這些「隔離」標誌,您可能會得到所有隨機字節。

+0

我認爲這是完美的解釋。謝謝!很高興像你這樣的聰明帥哥能夠幫助別人! – Jaxidian

+2

順便說一句,我現在已經證實,你對使用',IsolateByAppId'的評論也使得接下來的4個八位字節是相同的。這絕對是正確的答案。謝謝! – Jaxidian

相關問題