Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cookies 如果cookie数据只存储用户首选项,是否需要对其进行加密?_Cookies_Encryption - Fatal编程技术网

Cookies 如果cookie数据只存储用户首选项,是否需要对其进行加密?

Cookies 如果cookie数据只存储用户首选项,是否需要对其进行加密?,cookies,encryption,Cookies,Encryption,我正在创建一个基本的网站,它根据cookies中存储的用户偏好数据定制网站的外观。cookie中的数据存储方式如下: country,option1,option2...and so on. 我直接从cookies中读取这些数据,并对其采取行动。有没有理由我应该加密它,因为我认为这不会造成任何安全威胁。如果你不介意的话 用户能够看到它 用户是否能够更改它 那么您就不需要加密它了 我直接从cookies中读取这些数据,并对其采取行动 确保您有适当的验证。不要相信cookie不会被篡改。答案比

我正在创建一个基本的网站,它根据cookies中存储的用户偏好数据定制网站的外观。cookie中的数据存储方式如下:

country,option1,option2...and so on.
我直接从cookies中读取这些数据,并对其采取行动。有没有理由我应该加密它,因为我认为这不会造成任何安全威胁。

如果你不介意的话

  • 用户能够看到它
  • 用户是否能够更改它
那么您就不需要加密它了

我直接从cookies中读取这些数据,并对其采取行动


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

答案比您预期的要微妙一些

加密会使数据无法读取,但这是裸加密唯一能做的事情;它实际上并不阻止数据被修改。您需要的是消息身份验证(或者除了加密之外)。
这两种技术通常一起使用(如果您进行加密,您当然也必须进行身份验证),但它们的作用略有不同

如果您没有在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 } //64是十六进制编码的SHA-256哈希的长度 $hmacReceived=substr($_COOKIE['cookieName',0,64); $dataReceived=substr($_COOKIE['cookieName',64); $hmacomputed=hash_hmac('sha256',$dataReceived,$key); if(hash_等于($hmacomputed,$hmacReceived)) { //一切都很好 } 其他的 { //错误:已在应用程序外部修改接收的数据 } 这里有两个细节需要注意:

  • 与加密一样,密钥不是密码,它必须是随机的、不可预测的(这并不意味着对当前时间戳进行散列)。始终使用(PHP7)或生成密钥。SHA-256需要32字节的随机数据
  • 不要用简单的比较运算符替换
    hash_equals()
    。此功能专门用于防止定时攻击,而定时攻击可用于断开密钥
  • 这可能需要消化很多信息,但不幸的是,今天实现安全应用程序非常复杂。相信我,我真的尽可能地把它缩短了,重要的是你要理解上面的所有内容

    $stringCookieData = $hmac.$stringCookieData; // 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 }