恒定的验证密钥不是安全风险吗?

Isn't a constant validation key a security risk?

今天我了解到,在服务器场中,我不能使用 validationKey="AutoGenerate",而是为 validationKey 指定一个 'fixed' 字符串值,以确保场服务器处理请求的一致性。给出的例子是:

<machineKey  
validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7
               AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"           
decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
validation="SHA1"
decryption="AES"
/>

我的印象是为每个请求和每个用户生成一个新密钥大大增强了安全性,但如果密钥是常量,它可以从表单的隐藏字段中检索并用于伪造的请求。

或者我必须停止在服务器场上使用此密钥的隐藏字段并改用 header 或 cookie?

我说 anti-forgery 键存储在表单中,因为这个 Razor 标记:

@Html.AntiForgeryToken()

呈现这个 HTML:

<input name="__RequestVerificationToken" type="hidden" value="bH6_-oZcRMuC9tA13RrOzmr0N3sWrzgkjKOhg2igHs5K2-G0HbJbF3KaK-QMrUDcQTXFbHJ-HFMNn9AjvF-TkAuBFo5f8Afi8q0OHXBzOTI1">

除非我们在这里讨论的是不同的键,但那将如何工作?

不,这不是安全风险。

自动生成的密钥不会在表单的隐藏字段中发送,它存储在服务器 (ref) 上的本地安全机构 (LSA) 中。如果密钥以表单的形式发送,那么就不需要在多个服务器上使用相同的密钥。也不需要检索密钥来伪造请求,您可以在请求中发送您想要的任何密钥。

通过自动生成,服务器不会为每个请求生成新密钥,它会为服务器(或者如果使用 IsolateApps 选项时为应用程序)生成一个密钥。它只是为每个请求生成的消息验证码(MAC)。