如果只是存储用户首选项,是否有必要加密cookie数据?

时间:2015-08-19 03:45:47

标签: cookies encryption

我正在创建基于Cookie中存储的用户偏好数据来定制网站外观的基本网站。 cookie中的数据存储如下:

country,option1,option2...and so on.

我直接从cookie中读取这些数据并对其采取行动。是否有理由我应加密它,因为我认为这不会构成任何安全威胁。

2 个答案:

答案 0 :(得分:3)

答案比你期望的更加微妙......

加密会使数据不可读,但这是唯一的加密方式;它实际上并没有阻止数据被修改。您需要的是(或加密除外)消息身份验证 这两种技术经常一起使用(如果你进行加密,你肯定也必须进行身份验证),但他们的工作略有不同。

如果您不在cookie中存储任何私人敏感信息,那么您可能没有从用户隐藏(加密)它。但是,您绝对必须实现消息身份验证机制。

即使您不认为它目前是安全威胁,也可能是因为您没有考虑所有可能的攻击媒介,或者您实际上并未意识到所有这些攻击媒介。即使它现在是安全,但这并不意味着将来当您或您的同事添加更多功能或以其他方式改变应用程序的逻辑时。 因此,您必须从不信任未经验证的用户输入,无论其进入系统的方式,位置,时间或最初看起来有多无害。

编辑注释:您的问题没有引用PHP,但我认为它是Web应用程序开发最流行的语言。我确实需要一些语言来制作一个例子。 :)

在PHP中实现消息身份验证的最简单方法是使用hash_hmac()函数,该函数获取您的数据,密钥和加密哈希函数名称,以生成基于哈希的消息身份验证代码(HMAC) :

$hmac = hash_hmac('sha256', $stringCookieData, $key);

然后,您可以将生成的HMAC附加(或预先添加)到您的Cookie数据中,这实际上是您的签名"为它:

$stringCookieData = $hmac.$stringCookieData;

当然,当您收到cookie时,您需要验证该签名。为此,您需要使用您在cookie中收到的数据和相同的密钥重新创建HMAC,最后比较两个哈希值:

// 64 is the length of a hex-encoded SHA-256 hash
$hmacReceived = substr($_COOKIE['cookieName'], 0, 64);
$dataReceived = substr($_COOKIE['cookieName'], 64);
$hmacComputed = hash_hmac('sha256', $dataReceived, $key);

if (hash_equals($hmacComputed, $hmacReceived))
{
    // All is fine
}
else
{
    // ERROR: The received data has been modified outside of the application
}

这里有两个细节需要注意:

  1. 与加密一样,密钥不是密码,它必须是随机,不可预测的(并不意味着散列当前时间戳)。始终使用random_bytes()(PHP7)或random_compat生成密钥。 SHA-256需要32字节的随机数据。
  2. 请勿使用简单的比较运算符替换hash_equals()。此功能专门用于防止可能用于破坏密钥的计时攻击。
  3. 这可能需要消化很多信息,但不幸的是,今天实施安全应用程序非常复杂。相信我,我确实尽量让它尽可能短 - 重要的是你要理解上述所有内容。

答案 1 :(得分:0)

如果你没事的话

  • 用户能够看到它
  • 用户可以更改

然后你不需要加密它。

  

我直接从cookie中读取这些数据并对其进行操作

确保您有适当的验证。不要相信cookie不会被篡改。