2010-08-25 38 views
0

我想这个cookie密码存储安全系统上输入,这个cookie系统对于存储密码是否安全?

当用户蜱记得我框,它存储这些cookie:以纯文本
用户名。

使用服务器存储在数据库中的完全随机密钥加密的密码,永远不会传递给客户端,并且是特定于用户的密码,随每次登录都会更改。

然后,服务器在需要时使用加密密钥解码密码。

+1

请注意:如果您采用此路线,绝对没有理由在Cookie中实际存储加密密码。只需存储由服务器生成的足够长的随机数。由于它对客户来说没有任何意义,只要服务器可以验证它,存储的内容并不重要;所以不要打扰使它与密码相关。 – 2010-08-25 02:57:46

+0

@Mark Peters:您应该将其作为答案;) – caf 2010-08-25 04:37:41

回答

2

攻击者可以窃取别人的cookie,然后进行登录,而无需知道实际的密码。他们只会发送相同的cookie并进入。能够嗅探流量并稍后重新发送是一个重播攻击

最好的防御是使用SSL所以安全是端对端。如果你正在运行一个严肃的商业网站,那么你应该使用SSL,没有ifs和or或buts。使用SSL cookie将始终通过网络进行加密,因此,无论攻击媒介从数据包嗅探变为从终端用户的硬盘驱动器读取cookie,其内容都无关紧要。

如果您的网站不是那么严肃,然后阅读。

在我的网站上,我接收用户的密码并连接其IP地址和一个秘密令牌,并对所有这些密码进行散列。该散列存储在cookie中。然后在服务器上对它们进行身份验证,我重新计算散列并验证它们发送的匹配。

这将cookie与特定的IP地址绑定,因此它不能被第三方轻松地重用。它还消除了解密cookie和发现密码的任何危险,因为散列(SHA256,说)是单向的并且不能颠倒。

此外,我希望你不会在数据库中存储原始密码。您正在存储密码哈希,是吗?并且也是盐渍他们为了防止彩虹表攻击?

+0

不幸的是,使用IP严重限制了解决方案的实用性,因为它违背了cookie的目的,即识别客户端。这对我的智能手机或笔记本电脑来说非常烦人,例如,我使用了许多不同的热点。 – 2010-08-25 03:05:04

+0

非常好的点数。谢谢。 – 2010-08-25 14:01:05

+0

我很困惑你的两条建议如何协同工作。 数据库中没有明文密码,这很有意义。除了salt之外,您还要存储哈希密码+ salt,所以如果有人随密码一起出现,则可以验证它是否是正确的密码。 您在我的已登录cookie中拥有的东西是哈希密码+ ip +令牌。所以...你怎么能证实它是正确的?没有人拥有任何密码,所以你不能重新计算密码+ ip +令牌散列。 – 2011-08-10 18:56:38

2

没有违法意图,但你为什么要重新发明轮子?

许多人已经实现了他们自己的版本,为什么不搜索SourceForge?可重复使用的软件 - 您能否比您找到可接受(并经过测试)的解决方案更快地进行编码?

使用现成的构建模块,繁重的工作,并移动到有趣的部分;-)

0

正如Leonix所说,这可能更好留给以前开发它的人,并修复所有的错误。特别是因为它与安全有关。

除此之外,我可以发现的一个明显缺陷是缺乏身份验证,或者对'重放'攻击敏感,有人只是盲目地发送他们可以从他们想要模仿的人复制的cookie数据。

+0

所有的Cookie都有这个问题... – rook 2010-08-25 05:07:08

1

每@caf,加入这个作为一个答案:

如果你打算走这条路,让Cookie基本上存储服务器的秘密,但绝对没有理由认为秘密有什么关系与用户的密码。客户无论如何都无法解释数据的含义/价值。

  • 到客户端,它只是随机的数据,因为它不知道密钥
  • 到服务器,这是从是
    1. 独特的客户端的所有其他数据没有什么不同,和
    2. 秘密给服务器
  • 给攻击者,这是不多,也不少随机(或者类似地,硬穷举)大于等于比特长度的随机数。

从本质上讲,加密数据只是一个认证令牌,它具有特殊的规则来生成令牌。但是将令牌设置为用户的加密密码只会增加更多风险,因为现在如果攻击者以某种方式从服务器获取加密/解密密钥,则它们将拥有用户的密码。由于它具有内在价值,你已经使令牌本身成为一个有吸引力的目标。

因此,不要将加密密码存储在数据库中的cookie和加密密钥中,而只需让服务器生成足够长的随机数并将其存储在数据库和cookie中。因为它对客户端来说没有任何意义,所以使用令牌并不重要,只要它是随机的,很难猜测并且服务器可以验证它。不要打扰使它与密码相关。