我正在处理我的网络应用程序安全性,想知道我是否使用它:
<machineKey validationKey="AutoGenerate,IsolateApps"
compatibilityMode="Framework45" decryptionKey="AutoGenerate,IsolateApps"
validation="SHA1"/>
在我的web.config中,现在第一个用户向我的网站发送第一个请求,并且在这个时候,validationKey将被创建,之后第二个用户发送第二个请求,现在validationkey将再次创建或者是什么?
和所有用户的这些验证密钥相同吗?
该配置与此之间的差异是什么?
<machineKey compatibilityMode="Framework45"
validationKey="37BAD4B702C65CF39B1ED514AC4B3D88990DDF784AA0895659
B528ED95F8CA0A9CD1AF5ED92A2599362684CB8D204AC30D07E6BF0CF65194A5129"
decryptionKey="B450FB3271C49E6BA89A0C5C8D06B61875BCE4916A40474ED"
validation="SHA1" decryption="AES" />
哪一个更好用?
答案 0 :(得分:14)
AutoGenerate
表示您的密钥是自动生成的一次然后存储(由本地安全机构服务) - 换句话说,它不会在请求之间发生变化 - 事实上,它永远不应该在同一台机器上改变。
IsolateApps
表示每个应用程序(ETA: ,见下文)都有自己的验证/解密密钥 - 而不是机器上的所有应用程序共享一个密钥。但仍然会生成密钥,然后在第一次需要时进行存储,并将重复用于所有后续请求。
2017年更新:ASP.NET 4.5添加了IsolateByAppId
,与IsolateApps
相比,增加了进一步的隔离。 IsolateApps
根据每个应用的虚拟目录路径为其创建不同的密钥。这意味着如果同一服务器上的两个应用程序具有相同的虚拟路径(例如/
),只有通过托管在不同的端口或主机名上进行区分,它们仍将获得相同的密钥,甚至启用IsolateApps
。 IsolateByAppId
将根据应用程序的AppDomainAppID
创建不同的密钥。 (更新结束)
但是,如果您的应用程序托管在Web场,云端,群集等中 - 请求可能由不同的计算机处理,您需要密钥才能对于所有这些机器都是一样的 - 因此在第二个例子中预先生成的键。请记住,您需要自己生成这些(并正确生成它们),而不是重复使用其他人。
Here's an easy way to generate the keys with IIS 7
ETA:为避免链接损坏,以下是上述链接的概要:IIS 7及更高版本包括IIS管理器UI中的计算机密钥生成:在Machine Key
下为您的网站(找到在ASP.NET部分中,您将在操作面板中找到Generate Keys
操作。这使用RNGCryptoServiceProvider为您生成解密和验证密钥。
(曾几何时,显然SQLMembershipProvider
会抱怨自动生成的密钥 - 但只是为了避免上述问题,如果应用程序最终没有托管在单个服务器上。)
如果上述情况不适用于您,Microsoft建议使用默认值 - 即:
AutoGenerate,IsolateApps
(您还在第二个示例中将“AES”指定为解密算法,但由于AES是默认值,因此两者之间没有区别。)
2017年更新:为什么我要使用IsolateApps(和/或IsolateByAppId)?
问题应该是,为什么不会你?它默认开启。原因是没有它并托管多个应用程序的主机,如果您无法控制所有应用程序(例如共享主机),则每个应用程序都会获得相同的密钥,这不是最佳方案。
它是否有缺点(除了对Web场/云/集群没用)?是的,有点。 IsolateApps
会将dncryption密钥的熵减少32位(从192位减少到160),因为密钥的32位将是您的虚拟目录的哈希值,攻击者知道该哈希值(例如,如果你的应用程序位于域的根目录下,那些32位将是4e ba 98 b2
。IsolateByAppId
将其进一步减少32位到128位。
这使得你(基本上)相当于128位AES而不是192位AES用于解密密钥。类似地,验证密钥将从256位的熵减少到192位。
免责声明:以下段落在密码学中是一个危险的事情,因此,如果您正在进行安全关键工作,那么进一步研究它而不是信任它 - 特别是如果您正在使用具有超过下一个十年信息价值的数据的密钥。
无论如何:如果你不知道上述熵减少的影响,那些影响不大可能会让你感到困惑。对于验证密钥(散列),使用AES和192位熵的128位安全性在2017年超过“足够好”。 (因此,为什么首先没有详细记录这一点)。 (更新结束)