我应该为多个设备创建多少个cookie?

时间:2016-06-27 00:42:12

标签: php algorithm security cookies

我正在尝试创建一个Cookie来保持我的网站用户的记录。我让这个人从多个设备登录。那么我可以为所有用户的设备创建一个相同的cookie吗?或者我应该为不同的设备存储多个不同的cookie (以及为什么)

实际上,我认为在多个设备上为特定用户提供一个通用cookie没有任何问题。此cookie也不可更改。在用户更改密码之前,这将始终是固定的。我像这样创建了这个cookie:

md5($password.$user_id.$username);

该cookie基于密码,因为我想在他更改密码时注销,否则他将登录到他已经记录的所有设备。

我这样做是对的吗?

2 个答案:

答案 0 :(得分:1)

  

我这样做是对的吗?

不幸的是没有。

通过使用此设计创建Cookie:md5($password.$user_id.$username),您将使用最天真的方法来实现它们。一个基本的经验法则是永远不要将用户的凭据存储在cookie中。这适用于您使用的任何强大的散列算法。对于您使用的MD5算法,它不是那么强(Transcript Collision Attacks: Breaking Authentication in TLS, IKE, and SSH

  

或者我应该为不同的设备存储多个不同的cookie   (以及为什么)?

你不必。无用。作为一个良好的安全原则,如果您不需要,请不要在软件中添加功能(代码),否则您可能会增强attack surface

答案 1 :(得分:1)

加密哈希算法MD5已经开始被破坏,主要是关于其抗碰撞性能以及略微的原像抗性。请参阅the Wikipedia article, in the security section

因此,我不会将MD5用于任何与安全相关的安全性。与SHA-1类似的故事已经开始被打破,所以如果你确实需要哈希算法,我会使用SHA-2

您的方法存在的问题是您无法轻松撤消各个设备的令牌。如果其他值已知,那么将密码作为算法的输入可能会使其容易受到散列破解攻击。不要依赖你的秘密方法,Kerckhoffs's principle状态"密码系统应该是安全的,即使系统的所有内容(除密钥之外)都是公共知识。"。

您的方法的另一个问题是您的哈希算法需要明文访问密码,这可能表明您存储密码不安全。简而言之ensure you are using bcrypt for password storage。当然,您可能正在创建cookie并在用户输入密码的位置存储它的服务器端版本,但是如果您希望在密码更改时自动使cookie无效,那么我认为不会。

使用令牌管理设备的最安全方法是为每个设备生成128位随机令牌,并将此哈希值与SHA-2一起存储在数据库中。确保使用CSPRNG生成令牌。

因此:

    Cookie value: 128-bit token
    Database value: SHA-2(128-bit token)

请注意,这种钻头强度值不需要盐。然后,当用户更改其密码时,您只需删除该用户的所有服务器端令牌。此外,您还可以允许用户单独撤销不同设备的令牌,而无需更改密码。

在服务器端进行散列的原因是为了减轻攻击者获取会话表访问权限时的任何会话劫持。

相关问题