AutoGenerate
意味着您的密钥自动生成一次然后存储(由本地安全机构服务) - 换句话说,它不会在请求之间更改 - 事实上,它永远不应该在同一台机器上更改。
IsolateApps
意味着每个应用程序(ETA:大多数情况下,见下文)都有自己的验证/解密密钥 - 而不是机器上的所有应用程序共享一个密钥。但是,密钥会在第一次需要时生成并存储,并将被所有后续请求重用。
2017 年更新:添加了 ASP.NET 4.5 IsolateByAppId
,与IsolateApps
. 根据应用程序的虚拟目录路径IsolateApps
为每个应用程序创建不同的密钥。这意味着如果同一服务器上的两个应用程序具有相同的虚拟路径(例如),仅通过托管在不同的端口或主机名上来区分,它们仍然会获得相同的密钥,即使启用了。将根据应用程序的. (更新结束)/
IsolateApps
IsolateByAppId
AppDomainAppID
但是,如果您的应用程序托管在网络场、云中、集群上等 - 请求可能由不同的机器处理,则所有这些机器的密钥都需要相同 - 因此 pre -第二个示例中生成的密钥。请记住,您需要自己生成这些(并正确生成),而不是重用别人的。
这是使用 IIS 7 生成密钥的简单方法
ETA:为避免链接失效,以下是上述链接的概要:IIS 7 及更高版本在 IIS 管理器 UI 中包含机器密钥生成:在Machine Key
您的网站(在 ASP.NET 部分中找到)下,您将Generate Keys
在操作面板。这使用 RNGCryptoServiceProvider 为您生成解密和验证密钥。
(曾几何时,显然SQLMembershipProvider
会抱怨自动生成的密钥 - 但只是为了避免上述问题,如果应用程序最终不应该托管在单个服务器上)。
如果上述情况不适用于您,Microsoft 建议使用默认值 - 即:
- 如果您的应用程序托管在单个服务器上:使用
AutoGenerate,IsolateApps
- 如果您的应用程序位于网络场/云服务/集群网络上:使用手动生成的密钥。
(您还在第二个示例中将“AES”指定为解密算法,但由于 AES 是默认算法,因此两者之间没有区别)。
2017 年更新:我为什么要使用 IsolateApps(和/或 IsolateByAppId)?
问题应该是,你为什么不呢?默认开启。原因是没有它的主机并托管多个应用程序,每个应用程序都会获得相同的密钥,如果您无法控制所有应用程序(例如共享主机),这不是最佳方案。
它是否有缺点(除了对网络场/云/集群无用)?是的,有点。IsolateApps
将 dncryption 密钥的熵减少 32 位(从 192 位到 160 位),因为 32 位密钥将是您的虚拟目录的哈希值,攻击者知道该哈希值(例如,如果您的应用程序位于域的根,这 32 位将是4e ba 98 b2
.IsolateByAppId
将其进一步减少 32 位到 128 位。
这使您得到的(基本上)相当于 128 位 AES 而不是 192 位 AES 的解密密钥。类似地,验证密钥将从 256 位的熵减少到 192 位。
免责声明:以下段落在密码学中说起来很危险,因此,如果您正在从事安全关键工作,请进一步研究它而不是相信它 - 特别是如果您正在使用具有未来十年信息价值的数据的密钥.
无论如何:如果您不知道上述熵减少的含义,那么这些含义不太可能会咬到您。AES 的 128 位安全性和验证密钥(哈希)的 192 位熵在 2017 年已经超过“足够好”。(因此,为什么这首先没有被彻底记录)。(更新结束)