安全风险不是常量验证密钥吗?

时间:2015-09-07 16:45:43

标签: asp.net-mvc security asp.net-mvc-5 antiforgerytoken machinekey

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

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

我的印象是每个请求和每个用户的新密钥的生成都有相当多的增强安全性,但如果密钥是常量,则从表单上的隐藏字段中检索并在伪造请求中使用。

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

我说防伪密钥存储在表单中,因为这个Razor标记:

@Html.AntiForgeryToken()

呈现此HTML:

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

除非我们在这里讨论不同的密钥,但这有什么用呢?

1 个答案:

答案 0 :(得分:3)

不,这不是安全风险。

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

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