哪种加密算法最适合加密 Cookie?

2022-08-30 09:53:26

由于这个问题相当流行,我认为对其进行更新很有用。

让我强调一下AviD对这个问题的正确答案

您不应在 Cookie 中存储任何需要加密的数据。相反,在 Cookie 中存储一个大小适中(128 位/16 字节)的随机密钥,并将您希望在服务器上保持安全的信息(由 Cookie 的密钥标识)存储。



我正在寻找有关用于加密cookie的“最佳”加密算法的信息。

我满足以下要求:

  • 它必须快速
    加密和解密数据将(几乎)每个请求完成

  • 它将对小型数据集进行操作,通常是大约100个字符或更少的字符串

  • 它必须是安全的,但它并不像我们在保护银行交易

  • 我们需要能够解密信息,以便SHA1等被淘汰。

现在我已经读到河豚是快速和安全的,我已经读到AES是快速和安全的。河豚具有较小的块大小。

我认为这两种算法都提供了足够的安全性?因此,速度将成为决定性因素。但我真的不知道这些算法是否适合小字符串,以及是否有更适合加密cookie的算法。

所以我的问题是:
哪种加密算法最适合加密cookie数据?

更新
更准确地说,我们希望加密2个cookie:一个包含会话信息,另一个包含“记住我”信息。

该平台是PHP作为VPS上Linux上的apache模块。

更新2
我同意cletus的观点,即在cookie中存储任何信息都是不安全的。

但是,我们需要实现“记住我”功能。实现此目的的公认方法是设置一个cookie。如果客户端提供此cookie,则允许他或她以(几乎)相等的权限访问系统,就好像他/她提供了有效的用户名密码组合一样。

因此,我们至少要加密cookie中的所有数据,以便它:
a)恶意用户无法读取其内容,
b)恶意用户无法伪造自己的cookie或篡改它。

(在我们做任何事情之前,来自cookie的所有数据都经过清理并检查其有效性,但这是另一回事)

会话 Cookie 仅包含会话 Id/时间戳。它可能可以在没有加密的情况下使用,但我认为加密它没有害处吗?(计算时间除外)。

因此,鉴于我们必须在cookie中存储一些数据,加密它的最佳方法是什么?

更新3
对这个问题的回答使我重新考虑了所选择的方法。我确实可以在不需要加密的情况下做同样的事情。与其加密数据,我应该只发送没有上下文且无法猜测的无意义数据。

但是,我也不知所措:
我认为加密使我们能够将数据发送到BigBadWorld™,并且仍然(公平地)确定没有人可以读取或篡改它......
这不就是加密的全部意义吗?

但下面的反应是:不要相信加密来实现安全性。

我错过了什么??


答案 1

没有真正的理由不使用256位的AES。确保在 CBC 模式和 PKCS#7 填充中使用它。正如你所说,快速和安全。

我已经读过(未经测试)河豚可能稍微快一点......但是,Blowfish有一个主要缺点,即设置时间长,这会对您的情况不利。此外,AES更“成熟”。

假设确实有必要对称加密您的cookie数据。正如其他人所指出的那样,这真的没有必要,只有少数边缘情况别无选择,只能这样做。通常,最好更改设计,并返回到随机会话标识符,或者如有必要,还可以使用单向哈希(使用 SHA-256)。
在你的例子中,除了“常规”随机会话标识符之外,你的问题是“记住我”功能 - 这也应该实现为:

  • 一个长随机数,存储在数据库中并映射到用户帐户;
  • 或键控哈希(例如HMAC),包含例如用户名,时间戳,mebbe盐和秘密服务器密钥。这当然都可以在服务器端进行验证...

似乎我们已经偏离了您原始特定问题的主题 - 并通过更改设计来更改问题的基础....
因此,只要我们这样做,我也强烈建议反对这种持续“记住我”的功能,原因有几个,其中最大的一个:

  • 使某人更有可能窃取该用户的记忆密钥,从而允许他们欺骗用户的身份(然后可能更改其密码);
  • CSRF - 跨站点请求伪造。您的功能将有效地允许匿名攻击者导致不知情的用户向您的应用程序提交“经过身份验证”的请求,即使没有实际登录也是如此。

答案 2

这涉及到两个不同的问题。

首先,会话劫持。这是第三方发现(例如)经过身份验证的cookie并访问其他人的详细信息的地方。

其次,还有会话数据安全性。我的意思是您将数据存储在cookie中(例如用户名)。这不是一个好主意。任何此类数据从根本上都是不可信的,就像HTML表单数据是不可信的(无论您使用什么Javascript验证和/或HTML长度限制(如果有的话)一样,因为客户端可以自由地提交他们想要的内容。

您经常会发现人们(正确地)主张清理HTML表单数据,但cookie数据将被盲目地接受。大错。事实上,我从不在 Cookie 中存储任何信息。我将其视为会话密钥,仅此而已。

如果您打算将数据存储在cookie中,我强烈建议您重新考虑。

此数据的加密不会使信息更加可信,因为对称加密容易受到暴力攻击。显然,AES-256比DES(嘿嘿)更好,但256位的安全性并不一定像你想象的那么重要。

首先,SALT通常是根据算法生成的,否则容易受到攻击。

另一方面,Cookie数据是婴儿床攻击的主要候选者。如果知道或怀疑用户名在加密数据中,嘿,那里有你的婴儿床。

这就把我们带回到第一点:劫持。

应该指出的是,在PHP的共享托管环境中(作为一个例子),您的会话数据只是存储在文件系统上,并且可以由同一主机上的任何其他人读取,尽管他们不一定知道它是针对哪个站点的。因此,切勿在此类环境中存储明文密码,信用卡号,广泛的个人详细信息或任何可能被视为会话数据敏感的内容,而无需进行某种形式的加密,或者更好的是,只需在会话中存储密钥并将实际的敏感数据存储在数据库中。

注意:以上并非 PHP 所独有。

但这就是服务器端加密。

现在,您可以争辩说,使用一些额外的数据加密会话将使其更安全,免受劫持。一个常见示例是用户的 IP 地址。问题是许多人在许多不同的位置(例如Wifi热点,工作,家庭)使用相同的PC /笔记本电脑。此外,许多环境将使用各种 IP 地址作为源地址,尤其是在企业环境中。

您也可以使用用户代理,但这是可以猜测的。

所以真的,据我所知,根本没有真正的理由使用cookie加密。我从来没想过有,但鉴于这个问题,我去寻找被证明是对的或错的。我发现了一些关于人们建议加密cookie数据的方法的线程,透明地使用Apache模块进行加密,等等,但这些似乎都是出于保护存储在cookie中的数据(恕我直言,你不应该这样做)。

我还没有看到用于加密仅表示会话密钥的cookie的安全参数。

如果有人能指出相反的东西,我很乐意被证明是错的。


推荐