网站的几种识别用户身份的方法(Cookie 机制)

news/2024/5/18 11:55:53/文章来源:https://blog.csdn.net/m0_55030384/article/details/116996992

在网站应用中,由于 HTTP 协议是无状态的,识别不同用户的主要方法是通过 Cookie,即用户在认证后发送它让浏览器存储,之后每一次请求中再附带这个请求头信息发回服务器,这样服务器便知道是哪位用户发出的请求。

具体实现方法有哪些呢?下面我将为大家介绍几种常见的通过 Cookie 来识别不同用户的方法。

第一类:信息存用户侧

第一类的方法是将用户的部分信息存在浏览器的 Cookie 中(如用户 ID)。那么首要问题就是要防止被人为修改,因此实现方法有两种。

方法一:Base64 数据 + HMAC

首先,我们需要理解 HMAC。

HMAC,即使用哈希算法的消息认证码,简单来说就是使用密钥(准确来说是盐 salt)给数据上一个签名。

由于哈希算法是公开的,所以需要加上一段独一无二的密钥进行签名,如果没有这个密钥,几乎不可能篡改哈希值。

你也可以使用一套简易方法来自己实现消息认证码,比如如下的伪代码:

// 密钥
key = "你的密钥(盐)"// 消息
msg = "一些数据"// 使用 SHA256 算法进行签名
sha256(msg + key)// 输出省略

这样把密钥附加到消息后面,就实现了简单的消息认证码签名。但是还是建议使用现有的 HMAC 算法进行签名。

目前推荐哈希算法使用 SHA-2 系列,具体的有 SHA-224 SHA-256 SHA-384 SHA-512,也许你听说过 MD5,但 MD5 算法已被证明存在碰撞不再安全,SHA-1 也正在被逐渐淘汰,所以直接使用 SHA-2 即可。

接下来,应当使用 Base64 对数据本体进行编码,这么做并不是确保数据安全,因为 Base64 仅仅是一种公开编码规范,并没有加密,主要是确保数据中不会出现违反 HTTP 规范的字符导致出错。

整体流程如下:

  1. 用户登录,服务器已验证用户身份。
  2. 服务器将用户信息进行 Base64 编码。
  3. 服务器将 Base64 编码后的用户信息使用密钥(盐)进行 HMAC 签名。
  4. 将这两个信息与响应同时发送给用户,使用 Set-Cookie 响应头让浏览器自动设置 Cookie
  5. 用户下次请求时,浏览器将会自动将这两个信息发送回来,服务器再次使用相同算法计算用户数据哈希值,与用户发回的签名进行对比,如果一致则说明数据未被篡改,这样就验证了用户的身份。

光看文字可能不好理解,接下来使用伪代码进行解释:

userData = {"uid": 1,// 建议始终写入这个过期时间数据,防止 Cookie 有效期被篡改导致无限登录"expireAt": "2021-05-20 00:00:00"
}// 密钥,密钥生成请使用密码学上的随机数生成器,不要人为指定,建议不少于 16 个字节
secretKey = "这是你的密钥,不要泄露"// 对用户数据进行 Base64 编码
base64UserData = base64.encode(userData)// 对编码后数据进行签名并转换为十六进制字符串
sign = HmacSHA256(data=base64UserData, key=secretKey).toHex()// 可以使用逗号连接用户数据和签名,也可以另外使用一个 Cookie 值来存储签名,建议放一起方便管理
cookieValue = base64UserData + "," + sign// 设置响应中的 Set-Cookie 头
// 这里设置为一天后过期,请始终设置过期时间,并与前面用户数据中的 expireAt 一致
// 注意!为了防止 CSRF 攻击,始终设置 HttpOnly,具体请参照:
// https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies#%E9%99%90%E5%88%B6%E8%AE%BF%E9%97%AE_cookie
response.setHeader("Set-Cookie", `session=${cookieValue}; Max-Age=86400; Path=/; HttpOnly`)// 写入响应数据,这个随意,主要是设置 Set-Cookie 头
response.send("登录成功!")

顺利的话,浏览器就会接受这个响应头并设置 Cookie。

响应大概长这样(省略其他响应头):

HTTP/1.1 200 OK
Set-Cookie: session=编码后的数据,数据签名; Max-Age=86400; Path=/; HttpOnly

当服务器收到用户后续请求时,处理如下:

  1. Cookie 头中提取你设置的键对应的值,这里假设键为 session
  2. 分离数据和签名,如果给签名另外分配了 Cookie 则另外取出来。
  3. 对数据进行与发送响应阶段一样的签名计算。
  4. 将计算后的签名与收到的签名进行对比,一致则说明数据未被篡改。
  5. 检查是否过期,根据上述数据中的 expireAt 键值确定。如果过期,即使数据未被篡改也应视为不可信。

收到的请求大概长这样:

POST /send-comment HTTP/1.1
Cookie: session=编码后的数据,数据签名; ...其他 cookie,也许没有

伪代码如下:

// 取出 cookie
cookie = request.getCookie('session')// 分离签名和数据
data, sign = cookie.split(',')// 计算数据签名
sign1 = HmacSHA256(data=data, key="你的密钥")// 对比签名是否一致
if (sign !== sign1) {// 验签失败response.send("cookie 遭到篡改")return
}// 验签成功,Base64 解码数据
decodedData = base64.decode(data)// 验证是否过期
if (decodedData["expireAt"] < now()) {// 数据过期,不可信response.send("cookie 过期,请重新登录")return
}// 完全验证成功,已获取到用户身份,接下来继续写代码逻辑
uid = decodedData["uid"]
response.send("欢迎!用户 UID 为 " + String(uid))

优点:

  • 信息存用户侧,无需服务端存储,方便 。
  • Base64 编码速度快。

缺点:

  • 由于数据并不是加密,所以不能存储敏感信息(如验证码答案)。
  • 不能存储大量信息,因为 Cookie 的长度在不同浏览器有不同程度的限制。
  • 密钥泄露就完犊子。

方法二:对称加密数据

对称加密,即使用同一密钥对数据进行加密和解密,最常用的对称加密算法叫做 AES

AES 又分为 AES-128AES-256AES-512。区别是它们分别使用密钥长度为 16,32,64 字节,AES- 后面跟着的数字单位为 bit,1 字节=8 bit,这样就好理解些。

感觉有点复杂,本文也不是讲加密算法的,所以如果你不是很明白 AES,建议使用现成的库来进行加密解密。比如 JS 有 crypto-js,这个库你只需要提供密钥(长度不限),剩下的他会帮你自动解决。

你只需要知道以下几点即可:

  • AES 使用同一密钥进行加密解密,也就是说这个密钥绝对不能泄露。
  • 如果你能选择加密模式,禁止使用 ECB 模式(不安全)。
  • 部分加密模式加密后的数据若遭到篡改,将会导致解密失败(乱码或者报错),一定程度上相当于方法一中的 HMAC。如果你还是不放心,可以使用 CCM 或 GCM 模式(带签名的 AES 加密)。

接下来的代码与方法一重复部分不再详细讲解。

这个方法实现起来比方法一要简单一些,而且能存储敏感信息。伪代码如下:

// 用户数据
userData = {"uid": 1,"expireAt": "2021-05-20 00:00:00"
}// 密钥
key = "你的密钥"// 对数据加密
encryptedData = AES.encrypt(userData, key)// 设置响应头及发送响应省略

接收到了后续用户请求,伪代码如下:

// 获取 Cookie
cookie = request.getCookie("session")key = "你的密钥"// 尝试解密// 要注意的是,有的加密模式解密失败时并不会报错,而返回的是乱码,这个请根据实际情况确定
decryptedData = AES.decrypt(cookie, key)// 如果你的数据是 JSON 数据,那么只要尝试解析 JSON 数据失败了,就认定是解密失败try {jsonData = JSON.parse(decryptedData)
} catch(err) {// 解密失败response.send("数据解密失败")return
}// 数据解密成功,未遭到篡改,继续代码逻辑

优点:

  • 数据经过了加密,可以存储敏感数据。
  • 比方法一要简单一些。

缺点:

  • 根据不同加密模式,可能会影响性能
  • 同样不能存储大量数据。
  • 密钥泄露就完犊子。

第二类:信息存服务器侧

这个就非常简单了。方法如下:

  1. 生成随机 ID(可使用 UUID 标准,只要是无法预测的随机 ID 即可)。
  2. 在数据库以该 ID 为键,然后记录用户信息。
  3. 给用户设置该 ID 为 Cookie。

在用户下次请求时,便会附上这个 ID,根据这个 ID 去数据库查就行了。

这个方法虽然简单,但是一定要确保 ID 是随机,如果能预测就没任何含义了。

优点:

  • 生成的 ID 长度固定,不受限于 Cookie 长度限制。
  • 数据存服务器,用户无论如何也看不到,而且当用户未请求时也可以获取或修改这个信息。

缺点:

  • 还是数据存服务器,服务端得另外部署相关服务(如 Redis, MySQL, MongoDB 等数据库)。

总结

以上所有 Cookie 解决方案,只有一个目的,就是为了防止用户篡改数据,而不是为了防止数据泄露。想防止数据被第三方截获,请使用 HTTPS。

不同方法有不同的优缺点,还需根据实际情况决定。

我的博客,欢迎进来看看~_(:з」∠)_

https://www.passkou.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_846253.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kindle在线推书网站 强烈推荐

俗话说得好&#xff1a;腹有诗书气自华 突然间发现自己的kindle已经吃灰好久了 有的时候还会当做泡面盖用用 但后来彻底废弃了 归结其原因还是书籍资源太少&#xff08;懒&#xff09; 因为之前找书实在太痛苦了 即使买了Amazon的Kindle Unlimited会员 依旧有找不到的书 甚是痛…

深度学习(二):网站整理

目录 1.可视化卷积神经网络的网站 ​编辑 2.Yolov5模型权重下载 3.网络结构查看工具 4 kitti数据集 5 计算机视觉组 6 期刊影响因子查询letpub 7 MedSci期刊查询 8 DeepL翻译网站 9 几个不错的介绍数据集的博文 10 论文撰写相关 10.1 伪代码相关 10.2 paper_with_co…

论文(1):论文写作相关网站整理

#持续更新 1 英文关键词相关 &#xff08;1&#xff09;IEEE RA-L 期刊关键词&#xff1a; 链接&#xff1a;https://www.ieee-ras.org/publications/ra-l/keywords 提供两种关键词排序&#xff1a;按首字母和领域 下面列出了RA-L的关键字&#xff0c;首先按字母顺序&…

Operation DAY01( Nginx安装 、 用户认证 、 Nginx虚拟主机 、 HTTPS加密网站)

案例1:搭建Nginx服务器 案例2:用户认证 案例3:基于域名的虚拟主机 案例4:SSL虚拟主机 1 案例1:搭建Nginx服务器 1.1 问题 在IP地址为192.168.4.5的主机上安装部署Nginx服务,并可以将Nginx服务器,要求编译时启用如下功能: 支持SSL加密功能 设置Nginx账户及组名称均为…

网站备案备的是域名吗?

对于备案域名大家都很熟悉&#xff0c;为了更好地营造一个安全健康的网络环境&#xff0c;每一个网站上线前都要走备案流程。企业需要提交网站负责人、网站法人、域名等信息给空间服务商审核&#xff0c;审核通过后还需要工信部进一步审核&#xff0c;企业网站、空间服务商、域…

网站域名DNS被劫持了如何解决?

网站域名被劫持怎么办&#xff1f;打开访问某一网站域名时&#xff0c;发现页面内容跳转至另外一个不相关的网站&#xff0c;这就是遭遇了域名DNS劫持&#xff0c;因为大多数人并不了解其中的原理&#xff0c;所以通常大家都称为网站被劫持。 什么是DNS劫持&#xff1f; DNS劫持…

老域名对新网站优化的好处有哪些?

如何能快速掌握网站优化的技术和方法以及改进网站的排名是很多人都困扰的问题&#xff0c;也有人会说&#xff0c;选择一个老域名对网站的优化有很大的好处&#xff0c;下面和大家分享一下&#xff0c;老域名对网站优化有哪些好处。 老域名&#xff0c;顾名思义就是注册时间较长…

网站与备案类型不符会怎样?

一般网站不会去查你的备案信息和实际经验内容是否有差异的。除非你的网站含有前置审批的内容,前置审批包括:新闻、文化、出版、药品、医疗、视听、教育等内容。 还有就是你这个备案信息如果是个人备案的修改备案信息,建议您撤销了再重新备案,现在修改备案信息和您备案是异常的流…

低价域名好不好,可以建站吗?

域名交易是指个人或商业团体&#xff0c;将自己所注册的尚未到期且属于自己的互联网域名通过有偿方式授权&#xff0c;给中介网站和域名平台网站转让、出售等方式进行所属权变更的行为。低价域名交易靠谱吗&#xff1f;会有哪些陷阱&#xff1f;可以用来建站吗&#xff1f;下面…

如何把网站迁移到新域名?

企业在发展后期可能因为各种原因需要将网站迁移到新域名上&#xff0c;如果操作不当您可能会遭受暂时的流量损失&#xff0c;可能会影响您的搜索排名&#xff0c;您必须向您的网站受众表明您的新身份。不要担心&#xff0c;如果您遵循推荐的流程&#xff0c;并确保以最佳的方式…

什么是网站阻断?

备案信息二次核查&#xff0c;因为网站存在备案问题&#xff0c;未及时整改导致网站出现了阻断访问&#xff0c;如果您的网站通过IP地址或内网访问正常&#xff0c;但是通过域名访问出现白屏或连接超时情况&#xff0c;此时可能是因为您的ICP备案信息有误&#xff0c;网页被阻断…

常见的网站管理工具有哪些?

seo行业的应该都知道&#xff0c;我们在给网站做优化的时候&#xff0c;会用到一些工具来管理网站。不管我们是优化百度、360、goole、搜狗等这些搜索引擎&#xff0c;都需要一些工具来查询自己网站统计的一些信息&#xff0c;这些网站管理工具都是需要对网站域名进行验证的&am…

什么是seo外链工具

SEO外链工具&#xff08;商务营销助手&#xff09;软件包含了网络上所有的论坛群发软件&#xff08;论坛推广软件&#xff0c;论坛营销工具&#xff09;和博客群发软件&#xff08;博客营销软件、博客推广软件、博客群建软件&#xff09;及分类信息发布软件。肖景光实战派SEO站…

网站域名准备与检查的具体阶段

备案前您需根据网站建设的域名要求&#xff0c;准备并检查域名是否符合备案要求&#xff0c;以便保障后续的网站备案域名核验顺利&#xff0c;加速备案流程。 第一阶段&#xff0c;录入阶段。这个是我们提供备案所需要的资料。不管每个省份的要求是否一致&#xff0c;基本上都是…

Python攻防之弱口令、自定义字典生成及网站防护

这是作者的系列网络安全自学教程&#xff0c;主要是关于网安工具和实践操作的在线笔记&#xff0c;特分享出来与博友共勉&#xff0c;希望您们喜欢&#xff0c;一起进步。前文分享了Python网络攻防基础知识、Python多线程、C段扫描和数据库编程&#xff0c;本文将分享Python攻防…

保姆级教程:详细记录使用Python来爬取某网站的ts电影资源

首先找到我们需要蹂躏的网站 "http://www.wbdy.tv/play/29398_1_1.html" 在源代码中找到想要的播放内容 私信小编01即可获取大量python学习资源 打开这个在源代码里面的网站 http://www.wbdy.tv/js/player/?urlhttps://video.buycar5.cn/20200810/3UbmZCEa/index.m3…

利用python从GitHub获取https代理,采集网站的数据的速度翻倍

现在爬个网页太难了。 爬快了被封IP 爬慢了&#xff0c;等得着急 还是用代{过}{滤}理好了&#xff0c;从github上找到了大佬分享的免费代{过}{滤}理&#xff0c;貌似可以用&#xff0c;写了一个小脚本获取。 from multiprocessing.dummy import Lock import re import requests…

利用云函数+Python实现每日网站自动签到并用QQ提醒

利用云函数和Python实现蘑菇丁软件每日自动登录签到 由于怕token失效所以写成了每一次打卡前都要登录获取token一次&#xff0c;经过测试多次登录并不会造成登录异常&#xff0c;账号封禁等影响 Python3.6.2版本 """ 当然在学习Python的道路上肯定会困难&…

Java学习必不可少的十大网站

这是我为学习java的同学们准备的网站集合。这些网站提供新闻&#xff0c;常见问题或访谈问题的答案&#xff0c;精彩的讲座等。质量是好的网站的关键因素。我认为它们都具有最高的质量。在下文中&#xff0c;我还将分享如何使用这些网站进行学习或娱乐。 1. Stackoverflow St…

php网页怎么制作,PHP网站中保持登录状态

大多数网站在用户登录时会提供一个“记住我”或者“保持登录状态”的选项&#xff0c;只知道是用Cookie实现的&#xff0c;但是具体来说的工作流程是什么?因为要实现一个网站登录的东西&#xff0c;所以想从细节方面了解这个问题的朋友就一起来学习下吧。先说说结论&#xff1…