是否可以在cookie中存储哈希密码?

时间:2010-03-02 04:13:24

标签: security encryption cookies hash

我希望用户能够在我的网站上选择“记住我”框,这样他们每次来都不需要登录。因此,我需要在cookie中存储唯一ID以识别它们。用sha512和PHP中的长盐散列密码并将其存储在cookie中是否安全? 如果cookie被盗,他们的密码会有风险吗? 显然它必须以某种方式连接到他们的密码,否则如果cookie值被猜测或被盗,用户将无法阻止其他人登录。

另外,建议使用GUID作为唯一标识符吗?

谢谢, 本

6 个答案:

答案 0 :(得分:21)

请记住,密码的哈希值与密码有效。窃取哈希的人可以访问用户的帐户,就好像他们窃取了密码一样。因此,建议将用户密码的哈希值存储在cookie中,除非有一些其他信息与用于进行身份验证的cookie一起存储(即2-因素认证)。

答案 1 :(得分:12)

Here是关于这个主题的优秀文章。您问题的许多答案都是针对其中列出的技术。

答案 2 :(得分:3)

具有良好算法和大盐的风险很低,但为什么要冒任何不必要的风险呢?

如果您只需要识别用户,那么存储可以唯一识别用户的内容,例如guid以及其他一些存储的验证码(不是他们的密码,一些随机长字符串)。我不会单独使用guid,因为它不是一种安全的身份验证方法。

答案 3 :(得分:2)

在cookie中加入某种“密码”以及用户ID(防止用户将uid更改为另一个用户的密码)并不会有什么坏处,只是不要使“密码”相同作为实际用户的密码。

而且仅仅因为它是一个哈希并不一定意味着它是单向的(好吧,根据定义它确实如此,但是有一些实用程序来生成MD5明文,我猜它只是时间问题才会发生在其他人身上) 。我会哈希某种二级密码。

答案 4 :(得分:2)

执行此操作的另一种方法可能是将cookie用作仅用于间接数据的加密存储。您需要某种未加密的标识符,该标识符可用作指向应用程序数据库中密钥的指针(或导出密钥所需的信息),然后是从密钥获取的密钥加密的blob标识符,它本身将包含某种一次性可用的标识符,用于验证会话。

考虑以下假设:

  • 您的数据库是安全的(例如,您的应用程序可以访问它,但您的用户不能直接访问它,并且还假设该应用程序已经过防范SQL注入)
  • 你的盐很浓;也就是说,相当高的熵,即使密码已知,试图破解盐渍密码也是不可行的

然后,这将提供一种方法,通过该方法可以合理地确定会话不能以任何方式被劫持或被盗。也就是说复制的cookie只是用途有限,因为用户不得在攻击者盗窃和使用之间使用cookie。

虽然这可以防止重播,但这也意味着如果有人确实设法在恰当的时间窃取cookie,并且还管理在原始合法用户之前使用它,则攻击者现在可以控制会话。可以将会话限制为IP地址以减轻该风险(有些;如果用户和攻击者都在同一NAT后面,这是任何家庭或中小型企业网络中最可能出现的情况)那么这一点很有道理,因为无论如何IP地址看起来都是一样的。同样有用的可能是对当前用户代理的限制(尽管如果用户更新其浏览器并且会话在浏览器关闭时没有到期时可能意外中断),或者找到一种方法可以识别用户所在的计算机足够好,以确保用户没有将cookie从一个系统移动到下一个系统。如果不使用某些二进制插件(Flash或Silver / Moonlight),我不确定后者是否可行。

为了防止永久会话劫持,要求用户定期重新验证他或她自己(例如,限制允许的会话生命周期或需要像令牌/密钥/加密狗这样的东西)并要求用户重新认证他 - 或者自己进入应用程序的敏感区域,例如密码更改和潜在危险的操作,模式或行为,如删除数据,异常使用模式,批量操作等。

很难保护应用程序并保持其易用性。如果仔细完成,无论如何,对于大多数面向互联网的应用程序,安全性都可以以最小的侵入性而且仍然有效的方式实现。

答案 5 :(得分:0)

不建议这样做,但是如果您打算这样做,则至少在执行密码操作之前先对密码加盐。如果人们确实设法控制了访问者的Cookie,这将阻止人们使用哈希饼干。