表单身份验证票证是否始终加密?

时间:2017-07-13 21:55:45

标签: c# asp.net asp.net-mvc forms-authentication

我的想法:FormsAuthentication.SetAuthCookie创建的cookie始终是加密的。

这是我在查看Microsoft网站时的理解,其中说明使用Machine.config中的machineKey加密票证: https://support.microsoft.com/en-ca/help/910443/understanding-the-forms-authentication-ticket-and-cookie

为了100%确定它已加密,我运行了以下代码:

在一个页面上:

FormsAuthentication.RedirectFromLoginPage(user.user_name, false);

在下一页:

HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

FormsAuthenticationTicket authTicket = 
FormsAuthentication.Decrypt(authCookie.Value);

我看到cookie的值已加密,并且解密得很好。

然而,在这里查看最佳答案时:FormsAuthentication: Is it secure? 似乎不建议在Cookie中存储敏感信息。在上面的链接中,他甚至说"我认为你是用纯文本存储cookie"。

在这里查看二等评价时也是同样的事情:Storing more information using FormsAuthentication.SetAuthCookie

如果使用machineKey自动加密cookie,为什么假设它们以纯文本形式存储? 为什么在那里存储敏感信息存在问题?

P.S。我需要存储有关登录用户的敏感信息。

1 个答案:

答案 0 :(得分:3)

是不是总是加密?

如果您使用vanilla表单身份验证,则默认情况下会对Cookie进行加密。但是,它是一个框架 - 您可以自定义它 - 事实上,如果您了解API的方式,您可以设置任何您想要的cookie。但是你必须不遗余力地实现这一目标。

那张其他海报怎么样?

关于SO问题"Forms authentication...Is it secure?"。我不同意答案。正确的答案是:您应该从不存储密码,在cookie或其他任何地方,加密或纯文本。密码应该进行哈希处理,而不是存储。

我可以将密码存储在cookie中吗?

表单身份验证的方式应该有效,您不需要在其中存储密码。该cookie是防篡改的,如果只有您的网站可以创建cookie,并且您的网站仅在用户提供有效凭据时创建cookie,那么仅仅存在cookie就足以推断出正确的密码是早些时候提出过。但是,cookie应包含用户ID或某些获取用户ID的方法。

为什么我不应该将所有用户数据都放在cookie中?

不在cookie中存储太多的主要原因是它为每个请求消耗带宽,包括对图像,样式表和脚本的请求。将cookie添加为浏览器传递的每个GET和POST的标头。此外,cookie的解密每次都会占用CPU,即使您在较早阶段终止SSL,也不会卸载此处理。因此,如果你想在那里存储一些标志或字符串,很好,但不要存储任何大型数据结构。如果您需要存储会话中持续存在的大量数据,请考虑使用session variables。或者,如果您正在争取无状态Web应用程序,可以将会话数据存储在数据库中,并将数据库标识符存储在cookie中。

如果cookie已加密,为什么我需要小心将敏感数据放入其中?

因为时不时地vulnerabilites like this one突然出现。如果客户端计算机上不需要数据,则也不需要加密形式。最好只保留那些绝对需要的东西。

如果您选择使用会话状态

如果秘密是敏感的,那么你应该只使用进程内会话状态。如果使用SQL Server会话状态your data can be easily decrypted。另一种方法是在会话状态下加密凭证,只在你使用它们时解密它们,这将是一件苦差事,容易被忽视。您还可以编写一个自定义会话状态提供程序,覆盖所有内容的加密,但之后您会看到性能下降,因为几乎每个页面请求都会进行会话状态检索。所以我会进去。

另外,请务必遵循Microsoft's guidance确保会话状态。

如果你想成为现代人

如果您正在关注微服务和REST时尚,您可以这样做:

  1. 构建一个RESTful微服务,其唯一目的是安全地存储这些凭据。该服务只能在您的Web服务器的本地子网上使用,而不能在Internet上使用,并且应使用客户端证书和IP白名单进行保护。

  2. 在REST客户端和REST服务器上实现缓存控制,并将缓存过期设置得相当高,可能是24小时。

  3. 当网站需要凭证时,请致电微服务。如果您尊重缓存标头,那么您的REST客户端也应该缓存该值,这将避免重复调用服务。

  4. 但是如果你真的想要使用cookie

    如果您需要存储的凭据是用户自己的凭据,例如你是他们使用的一些谷歌应用程序的API的传递,然后我认为你可以把这些东西放在cookie中。毕竟,用户可能在某个地方拥有自己的机器。 AES-128 pretty much can't be brute forced,您可以使用AES-256来证明您的业务,如果您愿意的话。

    如果凭证不是地球上的常规公民应该拥有的,例如银行业务主机的申请密码,我不会这样做。