我的想法: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。我需要存储有关登录用户的敏感信息。
答案 0 :(得分:3)
如果您使用vanilla表单身份验证,则默认情况下会对Cookie进行加密。但是,它是一个框架 - 您可以自定义它 - 事实上,如果您了解API的方式,您可以设置任何您想要的cookie。但是你必须不遗余力地实现这一目标。
关于SO问题"Forms authentication...Is it secure?"。我不同意答案。正确的答案是:您应该从不存储密码,在cookie或其他任何地方,加密或纯文本。密码应该进行哈希处理,而不是存储。
表单身份验证的方式应该有效,您不需要在其中存储密码。该cookie是防篡改的,如果只有您的网站可以创建cookie,并且您的网站仅在用户提供有效凭据时创建cookie,那么仅仅存在cookie就足以推断出正确的密码是早些时候提出过。但是,cookie应包含用户ID或某些获取用户ID的方法。
不在cookie中存储太多的主要原因是它为每个请求消耗带宽,包括对图像,样式表和脚本的请求。将cookie添加为浏览器传递的每个GET和POST的标头。此外,cookie的解密每次都会占用CPU,即使您在较早阶段终止SSL,也不会卸载此处理。因此,如果你想在那里存储一些标志或字符串,很好,但不要存储任何大型数据结构。如果您需要存储会话中持续存在的大量数据,请考虑使用session variables。或者,如果您正在争取无状态Web应用程序,可以将会话数据存储在数据库中,并将数据库标识符存储在cookie中。
因为时不时地vulnerabilites like this one突然出现。如果客户端计算机上不需要数据,则也不需要加密形式。最好只保留那些绝对需要的东西。
如果秘密是敏感的,那么你应该只使用进程内会话状态。如果使用SQL Server会话状态your data can be easily decrypted。另一种方法是在会话状态下加密凭证,只在你使用它们时解密它们,这将是一件苦差事,容易被忽视。您还可以编写一个自定义会话状态提供程序,覆盖所有内容的加密,但之后您会看到性能下降,因为几乎每个页面请求都会进行会话状态检索。所以我会进去。
另外,请务必遵循Microsoft's guidance确保会话状态。
如果您正在关注微服务和REST时尚,您可以这样做:
构建一个RESTful微服务,其唯一目的是安全地存储这些凭据。该服务只能在您的Web服务器的本地子网上使用,而不能在Internet上使用,并且应使用客户端证书和IP白名单进行保护。
在REST客户端和REST服务器上实现缓存控制,并将缓存过期设置得相当高,可能是24小时。
当网站需要凭证时,请致电微服务。如果您尊重缓存标头,那么您的REST客户端也应该缓存该值,这将避免重复调用服务。
如果您需要存储的凭据是用户自己的凭据,例如你是他们使用的一些谷歌应用程序的API的传递,然后我认为你可以把这些东西放在cookie中。毕竟,用户可能在某个地方拥有自己的机器。 AES-128 pretty much can't be brute forced,您可以使用AES-256来证明您的业务,如果您愿意的话。
如果凭证不是地球上的常规公民应该拥有的,例如银行业务主机的申请密码,我不会这样做。