将密码存储在cookie中是否安全?

时间:2010-01-20 09:48:02

标签: c# asp.net asp.net-mvc passwords remember-me

我的网络应用程序主页上有一个 RememberMe 复选框。如果用户检查它,我将在cookie中存储电子邮件ID和密码。这是我的代码:

if (this.ChkRememberme != null && this.ChkRememberme.Checked == true)
   {
     HttpCookie cookie = new HttpCookie(TxtUserName.Text, TxtPassword.Text);
     cookie.Expires.AddYears(1);
     Response.Cookies.Add(cookie);
   }

我想知道的是:

  • 将密码存储在Cookie中是否安全?
  • 这样做的正确方法是什么?
  • 为Cookie设置时间的最佳做法是什么?

10 个答案:

答案 0 :(得分:58)

将密码存储在Cookie中是不安全的,因为它们以纯文本形式提供。

找到关于cookie的一些答案的好地方是Cookie Central.对于成员资格,通常使用带有长字符串的cookie,该字符串在您提供用户名和密码时从网站发出。有关此article中可以找到的流程的更多信息。 在ASP.NET中使用表单身份验证时,您可以像下面这样设置身份验证cookie:

FormsAuthentication.SetAuthCookie(userName, isPersistanceCookie);

第二个参数用于“记住我”功能 - 如果为true,它将创建持久性cookie,这些cookie将在您离开网站后持续存在。你也可以这样以编程方式操作cookie:

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

答案 1 :(得分:25)

没有!不要将密码存储在cookie中!

在ASP.NET中,使用

FormsAuthentication.SetAuthCookie(username, true);

第二个参数的值确定cookie是否是持久的(记住我复选框的值)。

答案 2 :(得分:15)

不,不是远程安全的。您不能保证cookie不以纯文本形式存储(事实上,大多数实现执行将它们存储为纯文本)。

请注意,“记住我”本质上是不安全的,因为任何拦截cookie的人都可以访问该应用程序。但是暴露用户密码会使其在不安全阶梯中更进一步。 :-)如果他们发现,可能会让用户真的很生气。

我使用加密的cookie字符串,该字符串包含用户的帐户名称以及与用户帐户无关(除)在我服务器上的表格之外的令牌。当用户返回站点时,我们解密cookie并查找该令牌是否实际上与该帐户相关联。令牌(以及cookie)会更改每次自动登录,并使用于该自动登录的令牌无效。 (令牌和帐户之间存在多对一关系,允许从多个位置自动登录。如果您愿意,可以限制。)如果在X天内未使用,则令牌超时。 (这不仅仅是通过限制cookie的持续时间来完成的;它也是在服务器端完成的。)我还有其他一些东西可以让那些试图生活的人很难找到解码cookie(已成功解密)或使用被盗的cookie(不需要解密),但过度杀戮没有意义(再次,“记住我”本身就是不安全的。)

我在一个没有必要(很明显)并且拥有大量动态IP客户端的强大安全性的站点上使用它,因此我不会尝试将其锁定到IP。但即使将其锁定到IP也不会使其安全,它只会稍微减少攻击面。

您可能想知道为什么我在cookie中有用户名。对于直接“记住我”的目的,我不建议在那里使用它,即使它是加密的(毕竟,它是用户名+密码系统中的一半认证对)。当我在提醒自己如何为这个问题做到这一点时,我查看格式时,我有点惊讶地发现它在我们的cookie中;但后来我看到这些评论解释了为什么它存在,并且有与“记住我”无关的原因(不一定是有说服力的原因,事后看来,但原因)。

最后一点,“记住我”本质上不安全的事实是网站日志非常重要的众多原因之一,以及为什么在允许更改重要帐户信息的过程中需要密码重新验证(制作窃取cookie的人更难获得该帐户的所有权。)

答案 3 :(得分:9)

这是你永远不应该做的,因为很容易改变cookie的值并发送回服务器。即使将“用户作为'naivists'”存放在cookie中也是错误的,因为我可以将其更改为“用户以'Pandiya Chendur'登录”。

您可以在Cookie中执行的操作是向客户提供信息,即使更改了这些信息,对服务器也没有意义。例如 - 最喜欢的颜色,首页布局等等。

你可以给他们提供存储在cookie中的会话ID,因为如果他们将值更改为其他内容,他们就无法为自己创造更好的东西(除非他们知道来自另一个会话的有效会话ID)。

Microsoft的MSDN says about using cookies

  

Cookie的安全问题是   类似于从中获取数据   客户端。在您的申请中,   cookies是用户输入的另一种形式   因此需要接受检查   和欺骗。用户可以至少   查看存储在a中的数据   cookie,因为cookie可用   在用户自己的计算机上。用户   也可以在之前更改cookie   浏览器将它发送给您。

     

您永远不应存储敏感数据   在cookie中,例如用户名,   密码,信用卡号码等   上。不要在饼干中放任何东西   这不应该掌握在手中   用户或某人可能以某种方式   偷走饼干。

     

同样,要怀疑   你从cookie中获得的信息。   不要假设数据是   你把它写出来的时候一样使用   使用cookie时的相同保护措施   使用a的数据的值   用户已键入网页。该   本主题前面的示例显示   HTML编码cookie的内容   在页面中显示值之前,   就像你在显示之前一样   您从用户那里获得的信息。

     

Cookie在浏览器和之间发送   服务器作为纯文本,任何人   可以拦截你的网络流量   读取cookie。你可以设置一个cookie   导致cookie的属性   仅在连接时传输   使用安全套接字层(SSL)。   SSL不保护cookie   正在被阅读或操纵   在用户的计算机上,但确实如此   防止cookie被读取   在途中因为饼干是   加密。有关更多信息,请参阅   Web的基本安全实践   应用

答案 4 :(得分:2)

将密码存储在Cookie中是不安全的,因为它们以纯文本形式提供。 但如果您的首选条件是这样做,或者您有任何用户要求,您可以通过加密字符串来实现。这可以使这个安全。

但不推荐,

答案 5 :(得分:2)

我认为你需要创建一个带有用户名和来自windows Identity的加密认证字符串的令牌。无需在cookie上存储密码。我们的应用程序存储了用户名和经过身份验证的字符串

答案 6 :(得分:2)

顺便说一下,无论是客户端还是服务器端,商店密码都不安全。

你不需要这样做。

答案 7 :(得分:1)

Branislav说了什么,以及......

除了不在cookie中放入敏感数据外,您还应该通过在web.config中至少放置以下内容来保护它们:

<httpCookies httpOnlyCookies="true" />

有关详细信息,请参阅:How exactly do you configure httpOnlyCookies in ASP.NET?

答案 8 :(得分:0)

一点也不安全。 Cookie存储在客户端计算机中,可以被篡改。

答案 9 :(得分:-1)

  • 如果您使用SSL,则在传输任何安全信息时应该使用SSL,这样可以避免第三方收听您的网络流量。无论是否在cookie中存储用户凭据,这都是同样的问题,因为当他们登录时,无论如何都要将他们的用户名和密码发送到服务器,我假设服务器对其进行哈希处理并将其与您为该用户设置的哈希密码进行比较。

  • 由于来源不同,其他域名永远无法读取您的Cookie,因此不存在问题。

  • 真的是唯一的安全漏洞&#34;如果你想打电话,如果有人实际上可以访问他们的电脑。如果发生这种情况,他们最有可能获得任何想要该人的信息。你如何解释chrome auto为你填写登录表单的时候是否安全?我确定他们不是以纯文本形式存储它,但这并不重要。如果您转到Chrome自动填充的页面,您只需从表单中复制密码,然后查看您现在拥有该人员的密码。

  • 这真的归结为&#34;安全&#34;你需要它。我同意以过期作为令牌加密用户信息是验证服务调用的最佳方式,并且它提供了灵活性。我只是没有看到将登录凭据存储在cookie中的问题。