☰
Cookie解密全攻略:从Base64编码到AES加密的完整解析
2026/10/21 18:24:00 网站建设 项目流程

拿到一个 Cookie 却不是明文,而是像e0J9M3Qw...这样一串看不出含义的字符,是很多开发者都遇到过的情况。做接口联调、排查登录态异常、做安全审计的时候,这类被笼统称为“Cookie 解密”的技术问题几乎绕不开。我最早被这个问题卡住,是在调试某个系统的单点登录对接时,对方文档只写了“Cookie 使用了加密存储”,剩下的全靠自己猜。后来踩了不少坑,也陆陆续续把编码、签名、加密这几类常见情况都摸了一遍,这里把完整的实现思路和可复现代码整理出来,给同样被密文困扰的人一个参考。

这个内容适合谁?简单说三类人:后端开发排查会话状态时,发现 Cookie 里的数据读不出来;测试人员在准备自动化用例时,需要构造或校验登录态;还有做安全自查的同行,想确认自家系统的会话数据是否存在泄漏风险。文章不假设你已经懂密码学,所有概念都会用大白话解释,每段代码都能直接跑。

1. Cookie 为什么会变成一串乱码

1.1 服务端的两个核心诉求:防篡改与防泄露

浏览器里的 Cookie 本质是服务端发给客户端的一段文本,客户端每次请求都会原样带回。问题在于,这段文本存放在用户自己的电脑上,用户完全可以用各种工具打开、修改、伪造它。如果服务端把“用户ID”“角色等级”“会员到期时间”这类关键信息明文写在 Cookie 里,那用户只要改一个数字,就可能把自己从普通用户变成管理员。这是会话类 Cookie 必须解决的第一个问题:防止客户端篡改内容。

第二个问题是防泄露。Cookie 在传输过程中可能经过代理服务器、公共 WiFi 等中间环节,如果内容明文存储,第三方一旦截获,就能直接读取用户身份信息和业务数据。所以服务端不能把敏感信息直接塞进 Cookie 里。

这两点诉求引出了三种不同的处理策略:编码、签名、加密。很多开发者把它们混为一谈,其实三者完全不同。编码不提供任何安全性,只是换种字符表示;签名保证内容没被篡改,但内容本身别人依然看得到;加密则把内容变成密文,只有持有密钥的人才能还原。理解这个区别,是后面所有操作的基础。

1.2 三种常见 Cookie“密文”形态与识别

拿到一段看不明白的 Cookie 值,第一步不是急着解密,而是先判断它属于哪一类。我的经验是对照特征快速分类:

形态典型外观核心目的能否还原出明文
编码类eyJ1c2VyIjoiYWRtaW4ifQ%3D%3D或YWRtaW46MTIzNDU2兼容传输、缩短长度无需密钥,直接解码
签名类dXNlcj1hZG1pbg==.f9a7c3f65e4d2b8a或 `21:0...`
加密类gAAAAABm7TzB...或6d3a829f4c5e...防泄露、防篡改必须持密钥才能解密

判断方法也很简单:先看字符集。如果主要由A-Z a-z 0-9 + / =组成,大概率是 Base64 编码;如果出现了大量%XX格式,就是 URL 编码;如果字符串被.分隔成两到三段,且有一段是十六进制字符,多半是签名类;如果以gAAAAAB开头,那是对称加密框架的典型密文头。

1.3 为什么不能一上来就“暴力解密”

很多人下意识的做法是不断尝试各种解密算法,把能想到的都跑一遍。这个思路效率很低。解密不是猜谜,所有能被“解”出来的内容,设计者本来就没打算保密;真正加密的内容,没有密钥和算法信息是解不开的。所以正确的路线是先通过特征定位类型,再去找算法和密钥的线索。通常最快的路径是直接翻后端代码或配置文件,而不是对着密文穷举。我在实际工作中,绝大多数 Cookie 的“解密”,最后都收敛到了“找到它是用什么方案生成的”这一个问题。

2. 解密前的准备与安全边界

2.1 你需要准备的调试工具

工欲善其事,必先利其器。我平时处理 Cookie 问题时常用的工具链如下:

  • 浏览器开发者工具:F12 打开后,在 Network 面板里查看请求头的 Cookie 响应(Set-Cookie),以及在 Application 面板里查看当前站点所有已存储的 Cookie。Chrome 的 Copy as cURL 功能也很好用,能把整个请求原样导出。
  • 抓包工具:如果要在非浏览器环境(比如移动端 App、桌面客户端)调试,就需要抓包工具来查看 HTTP 请求与响应。这个工具链是调试联调问题的标准配置,不属于任何敏感行为。
  • Python 环境:推荐 Python 3.8 以上版本,配合cryptography和PyJWT两个库,一个管对称加密,一个管 JWT。安装命令是pip install cryptography PyJWT。
  • 文本工具:VS Code 或任意编辑器,用来临时写测试脚本、查 JSON 结构。

这套组合足够覆盖绝大多数场景。不需要装额外的重型软件,浏览器加脚本就能跑完整个流程。

2.2 合规前提:哪些场景允许你解密

这里必须说清楚边界。Cookie 解密这件事本身是中性的,但用在错误的场景就变成了越权行为。合法合规的调试场景包括:

  • 你本人是系统的开发者或维护者,正在排查自己系统的登录态、会话数据问题;
  • 你获得了系统方的书面授权,在测试环境做安全评估;
  • 第三方系统与你做联调时,主动提供了测试账号和密钥材料。

不做的事也同样明确:不针对未授权的第三方系统破解会话数据,不把解出来的用户信息用于任何越权访问,不在生产环境导出的真实用户 Cookie 上做“练手”。我见过有人拿网上下载的压缩包里的“客户数据”练解密技术,结果解出来的是真实姓名和手机号,这个性质就完全变了。技术文章可以教方法,但方法必须用在有授权的地方。

2.3 拿到样本后的第一步判断

拿到一段 Cookie 值,不要急着写脚本,先花十秒钟做三步判断:

第一步,观察有没有明显分隔符。点号分隔大概率是签名;横杠或波浪线分隔往往是时间戳签名(如某知名 Web 框架的格式)。第二步,看字符集。如果只有大小写字母和数字,且长度是 16 的倍数,很可能是二进制密文转成了十六进制。第三步,试着把字符串里%开头的部分做 URL 解码,很多时候光这一步就能让内容现出原形。

这三步是纯低成本的观察,不需要任何工具。做完之后,你至少能判断出这是编码、签名还是加密,然后就能按照本文第三、四、五章的方法对症下药。

3. 编码型 Cookie 的解码实现

3.1 Base64 和 URL 编码的完整解码代码

严格的分类里,编码型 Cookie 不能被叫“解密”,因为没有密钥。但实际遇到时,它确实是一串“读不出来”的字符,所以也归在这一类里处理。

Base64 编码的典型特征是字符集限定在A-Z a-z 0-9 + / =,长度通常是 4 的倍数。URL 编码的典型特征是出现了大量%XX。这两种经常同时出现,因为 Cookie 值在传输时会被强制做 URL 编码,于是 Base64 字符串里的+变成了%2B,/变成了%2F,=变成了%3D。

我常用的解码脚本如下:

import base64 from urllib.parse import unquote def try_decode_cookie(value: str) -> str: # 第一步:URL 解码 decoded = unquote(value) if decoded != value: print("[1] URL 解码结果:", decoded) value = decoded # 第二步:尝试 Base64 解码(处理缺失填充符的情况) try: # 补齐 Base64 的填充符 = padding = "=" * (-len(value) % 4) raw = base64.b64decode(value + padding) print("[2] Base64 解码结果:", raw.decode("utf-8", errors="replace")) return raw.decode("utf-8", errors="replace") except Exception as e: print("[2] Base64 解码失败:", e) return value

这段代码的顺序是有讲究的:先做 URL 解码再做 Base64。因为如果先解 Base64,字符串里的%2B会被当成普通字符,导致解码结果完全错误。反过来先解 URL,%2B变回+,Base64 才能正常工作。

3.2 踩坑:字符集、填充符与双重编码

编码型 Cookie 的坑主要集中在三个地方。

第一个坑是 Base64 的填充符。标准 Base64 要求长度是 4 的倍数,不满足时用=补齐。但很多 Cookie 在生成时省去了填充符,直接截掉尾部等号。直接把这样的字符串丢给 Python 的b64decode,会报Incorrect padding错误。解决方案就是我上面代码里写的,先算-len(value) % 4补齐。

第二个坑是 URL-safe Base64。标准的 Base64 包含+和/,但在 URL 里这两个字符有特殊含义,所以有些系统会换成-和_。解码时要改用base64.urlsafe_b64decode,而不是b64decode。判断方法是看字符串里有没有出现-和_。

第三个坑是双重编码。我曾经遇到一个 Cookie,值长这样:YWRtaW4lM0ExMjM0NTY=。直接 Base64 解码得到的是admin%3A123456,看起来像是乱码,其实这是“先 Base64 再 URL 编码”的结果。正确的处理是解完 Base64 之后再解一次 URL 编码,才能看到真正的明文admin:123456。遇到解码结果里仍然有%的情况,继续解一遍就不会错。

4. 签名型 Cookie 的验签与解析

4.1 HMAC 签名的构成与原理

签名型 Cookie 比编码型稍微进阶一点,但它也谈不上“加密”。签名型 Cookie 的典型结构是内容.签名:点号左边是原文的编码形式(通常是 Base64),右边是一段十六进制字符串或 Base64 字符串,作为签名。

签名的作用是防篡改。服务端生成 Cookie 时,用密钥对“内容”计算一个摘要(比如 HMAC-SHA256),然后把内容和摘要拼在一起发给浏览器。浏览器再次请求时,服务端拿到 Cookie,用同样的密钥重算一遍摘要,如果和附带的摘要一致,就说明内容没被改过。

这个方案有个特点:签名只能保证完整性,不能保证机密性。左边的内容依然是可读的,任何人用 Base64 解码都能看到明文。所以签名型 Cookie 通常只放一些不敏感的信息,比如用户 ID、会话编号。真正敏感的数据不会用这种方式存储。

4.2 如何重建签名并验证数据完整性

当你需要验证一个签名型 Cookie 是否被篡改时,需要找到生成它所用的密钥。这个密钥一般在服务端配置里,常见的名字有SECRET_KEY、SESSION_SECRET、SIGNING_KEY。

验证脚本的核心逻辑是:从 Cookie 里取出签名,用自己的密钥重新计算签名,然后比较两者是否一致。

import hmac import hashlib def verify_signed_cookie(cookie_value: str, secret: str) -> bool: # 分隔符是最后一个点号 payload, _, signature = cookie_value.rpartition(".") # 重新计算签名 expected = hmac.new( secret.encode("utf-8"), payload.encode("utf-8"), hashlib.sha256 ).hexdigest() # 使用 compare_digest 防止时序攻击 return hmac.compare_digest(expected, signature) # 示例 cookie = "eyJ1c2VyX2lkIjoxMDEsInJvbGUiOiJhZG1pbiJ9.8f4cd9e1a2b3c4d5e6f7a8b9c0d1e2f3" print(verify_signed_cookie(cookie, "test_secret"))

注意hmac.compare_digest这一行。普通的字符串比较在发现第一个不同字符时就会返回结果,耗时和比较长度相关,攻击者可以通过响应时间推测签名内容。compare_digest消除了耗时差异,是安全编程的基本要求。

4.3 实战:解析某登录系统的签名 Cookie

我自己遇到过一个典型的例子,是某内部后台系统使用的会话 Cookie,值的格式是:

2|1:0|10:1542321140|4:session|8:Zm9vYmFy|3:f4a6c4e9...

第一眼看去完全不知道是什么。仔细观察后,发现它其实是 Python 某 Web 框架的签名 Cookie 格式。拆解后大致是:版本号、时间戳、会话数据经 Base64 编码后的内容、最终签名。

这个框架有现成的解析函数,直接用工具库获取签名密钥后调用即可:

from itsdangerous import URLSafeTimedSerializer # 密钥在服务端配置里,这里是脱敏后的示例 SECRET_KEY = "test_secret_key_please_change" serializer = URLSafeTimedSerializer(SECRET_KEY) cookie_value = "2|1:0|10:1542321140|...完整值..." data = serializer.loads(cookie_value, max_age=3600) print("解析出的会话数据:", data)

这个案例给我们的启示是:遇到复杂格式时,优先从格式特征推测框架,再去查框架的官方文档或源码,找到对应的解析函数,比自己盲写解析器高效得多。很多知名框架的签名 Cookie 格式都是公开的,只是官方文档不高频强调而已。

5. 加密型 Cookie 的 AES 解密方案

5.1 对称加密的参数拆解:Key、IV、Padding

加密型 Cookie 和前两类有本质区别,它用对称加密算法把明文变成真正的密文,没有密钥的情况下很难还原。最常见的加密方案是 AES,而 AES 在 Cookie 场景里又有两种主流模式:CBC 和 GCM。

AES 有三个关键参数,缺一个都解不开:

Key(密钥)是 16、24 或 32 字节,分别对应 AES-128、AES-192、AES-256。Cookie 加密一般用 AES-256,因为 Cookie 本身可能包含用户标识,安全要求更高。IV(初始化向量)是 16 字节的随机数据,CBC 模式下必须要求每次加密都使用不同的 IV,否则同样的明文会产生同样的密文,攻击者就能通过比对密文发现规律。Padding(填充)是必须的,因为 AES 是分组密码,明文长度必须是 16 字节的倍数,不足时要补齐。最常见的填充方案是 PKCS7,也就是缺几个字节就填几个数字几。

服务端加密时,通常会把 IV 和密文一起发送,常见的拼接方式是iv + ciphertext再整体 Base64,有时也会把 IV 放在密文前面用某种前缀标记。找到 IV 的位置是解密的关键一步。

5.2 Python 实现 AES 解密

在 Python 中用cryptography库实现 AES-CBC 解密,代码非常简洁:

import base64 from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import padding def aes_cbc_decrypt(encrypted_b64: str, key: bytes, iv: bytes) -> str: # 先 Base64 解码得到原始字节 encrypted = base64.b64decode(encrypted_b64) cipher = Cipher(algorithms.AES(key), modes.CBC(iv)) decryptor = cipher.decryptor() decrypted = decryptor.update(encrypted) + decryptor.finalize() # 去除 PKCS7 填充 unpadder = padding.PKCS7(128).unpadder() plain_bytes = unpadder.update(decrypted) + unpadder.finalize() return plain_bytes.decode("utf-8", errors="replace") # 示例:key 必须是 16/24/32 字节 key = b"0123456789abcdef0123456789abcdef" # 32字节 iv = b"abcdef9876543210" # 16字节 cookie_cipher = "7VO0Bfqv1FowCSfZR4YhBg==" print(aes_cbc_decrypt(cookie_cipher, key, iv))

如果服务端把 Ivy 混在密文里发送,比如密文的前 16 字节是 IV,后面是真正的密文,那么需要在代码里做拆分:

raw = base64.b64decode(encrypted_b64) iv, ciphertext = raw[:16], raw[16:]

这个模式非常常见,很多框架为了减少一个参数,直接把随机 IV 拼到密文最前面,解析时前 16 字节就是 IV。如果你解密出来的结果是乱码,优先检查是不是这种拼接方式。

5.3 从服务端代码定位密钥与加密模式

密钥和算法信息的获取途径,正规场景下只有一种:系统自己的源码或配置。任何声称“不需要密钥就能解开 AES”的工具,要么是碰到了编码类 Cookie,要么是在骗人。

拿到服务端源码后,我通常会直接搜索这些关键词:AES.new、Cipher、encrypt、SecretKey、SESSION_KEY、cookie_secret。定位到加密代码后,重点确认三件事:使用的算法和模式(AES-CBC 还是 AES-GCM)、密钥是否硬编码(硬编码是坏味道,但现实中反复出现)、填充方案是 PKCS7 还是 ZeroPadding。

如果系统使用的是cryptography库,代码里会有Cipher(algorithms.AES(key), modes.CBC(iv))或modes.GCM(iv)这样的结构,一眼就能确认。如果用的是pycryptodome,则是AES.new(key, AES.MODE_CBC, iv)。这两种库在 API 上有细微差别,但本质上做的是一回事。

值得注意的一点是 GCM 模式。GCM 是 AEAD 方案,加密后除密文外还会生成一个认证标签(tag),解密时不仅要用密钥,还要校验标签是否匹配。GCM 的解密流程比 CBC 多一步,代码上更容易出错,但安全性更高。如果遇到的是 GCM,解密代码需要调整:

from cryptography.hazmat.primitives.ciphers.aead import AESGCM aesgcm = AESGCM(key) # GCM 方案里 nonce 即 IV,通常为 12 字节 plaintext = aesgcm.decrypt(nonce, encrypted, None) print(plaintext.decode("utf-8", errors="replace"))

注意 GCM 的 nonce 一般是 12 字节,而 CBC 的 IV 是 16 字节,这个区别很容易让解密失败。如果你按 CBC 的逻辑拆出 16 字节当作 IV,结果大概率会报InvalidTag或产生乱码。

6. JWT 型 Cookie 的解析与校验

6.1 JWT 三段结构与常见误区

JWT(JSON Web Token)在现代系统中被大量用作 Cookie 的会话载体,但它本身不是加密方案。JWT 的结构是三段式,用点号分隔:

header.payload.signature

header 和 payload 都是 JSON 的 Base64URL 编码,没有任何加密。任何人拿到 JWT,把它按点号一拆,再把中间那段 Base64URL 解码,就能直接读出里面的用户信息。我之前见过不少人把 JWT 当加密用,往里面塞手机号、身份证号,然后被“解密”出来还一脸惊讶,这是对 JWT 最大的误解。

JWT 的 signature 才是保护完整性的部分,它用 header 里声明的算法对header.payload做哈希运算,防止内容被篡改。所以 JWT 的真实定位是“签名令牌”,不是“加密令牌”。

6.2 手动解析与标准库解析

解析 JWT 最稳妥的方式是使用库,但了解手动解析能帮助你理解它的本质。手动解析只需做 Base64URL 解码:

import base64 import json def b64url_decode(segment: str) -> bytes: padding = "=" * (-len(segment) % 4) return base64.urlsafe_b64decode(segment + padding) def decode_jwt_payload(jwt: str) -> dict: header_b64, payload_b64, _ = jwt.split(".") header = json.loads(b64url_decode(header_b64)) payload = json.loads(b64url_decode(payload_b64)) return {"header": header, "payload": payload} jwt_value = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMDEsInJvbGUiOiJhZG1pbiIsImV4cCI6MTcxMDAwMDAwMH0.Xn6PfL..." print(decode_jwt_payload(jwt_value))

验签则要用PyJWT库,它封装了各种 signature 算法,用起来更规范也更安全:

import jwt SECRET = "test_secret_key" token = "eyJhbGciOiJIUzI1NiIs..." try: payload = jwt.decode(token, SECRET, algorithms=["HS256"]) print(payload) except jwt.ExpiredSignatureError: print("令牌已过期") except jwt.InvalidSignatureError: print("签名校验失败,令牌可能被篡改")

需要注意的一点是,解码和验签是两回事。只解码不需要任何密钥,任何人都能做;但要确认令牌是否被改动,必须有密钥并执行校验。如果只调decode不传密钥,那就只是“读”了一下内容,没有任何安全保障,这在调试和排查时一定要区分清楚。

7. 实操案例:一次完整的 Cookie 解密流程

7.1 案例背景与样本

为了让你对整个过程有一个完整的体感,我模拟一个常见场景:某内部后台系统,登录后浏览器里的 Cookie 值是:

session=N2Y1MmQwZTM2...bWlu

现象是接口返回 401,开发怀疑是 Cookie 被篡改或者格式不对。我拿到这个 Cookie 后,先按第二部分的判断方法走了一遍流程。

第一步看字符集:全是大小写字母和数字,末尾没有等号,长度是 48 位。第二步看分隔符:没有点号、没有横杠,所以排除了签名型 Cookie。第三步直接尝试 Base64 解码,用第二节的try_decode_cookie跑了一下,输出的结果是一串十六进制字符串。十六进制本身也可能是数据的另一种编码,于是继续做一步转换。

这里简单记录一下判断链:Base64字符串解密得到一段 hex,hex 转字节后又得到一段可读文本。整个过程需要层层剥开,不能只解一层就停下来。

7.2 自动识别与解码脚本

为了让这类处理变得更省事,我整理了一个“自动识别并解码”的小脚本,输入一段 Cookie 值,依次尝试 URL 解码、Base64 解码、十六进制转换,并在每一步打印中间结果,方便观察:

import base64 import binascii from urllib.parse import unquote def smart_decode(value: str): print("原始值:", value) # 第1层:URL编码 v = unquote(value) if v != value: print("URL解码:", v) value = v # 第2层:Base64 try: padding = "=" * (-len(value) % 4) raw = base64.b64decode(value + padding) print("Base64解码字节:", raw) # 第3层:如果结果是十六进制,再转一次 try: hex_string = raw.decode("ascii") if all(c in "0123456789abcdefABCDEF" for c in hex_string): plain = bytes.fromhex(hex_string) print("十六进制转字符串:", plain.decode("utf-8", errors="replace")) except Exception: print("直接按UTF-8解码:", raw.decode("utf-8", errors="replace")) except Exception as e: print("Base64解码失败:", e) smart_decode("N2Y1MmQwZTM2...bWlu")

这个脚本不是什么高深技术,就是省去每次手动试错的时间。实际遇到多层编码时,逐层展开直到出现人类可读文本为止,基本策略就是这样:每解一层就重新观察输出,看看是否还符合编码特征。

7.3 结果验证与后续操作

解码完成后不要急着结束,验证结果是否可靠也很重要。验证方法是对比原始 Cookie 和服务端日志中的会话数据。如果服务端在访问日志里记录了user_id=101这样的信息,而你从 Cookie 里解出的数据也是这个值,那说明解析正确。

如果内容里有时间戳,验证时还要检查时间是否在有效期内。比如有些会话 Cookie 会带上签发时间1542321140,换算成北京时间后和实际登录时间对比,如果差异很大,说明数据可能被伪造过,需要走完整签名和加密验真的流程。

整个案例走下来,你会发现绝大多数 Cookie 解析其实是“多层编码的剥洋葱”过程,真正的加密解密只占一小部分。但掌握了完整链路,遇到加密型 Cookie 时也心里有底。

8. 常见问题速查与经验技巧

8.1 解密失败十大原因

把这几年遇到的典型问题整理成一张表,基本覆盖了 90% 的解密失败场景:

问题现象根本原因排查方向
Base64 报 Incorrect padding字符串缺少填充符=先补齐等号再解码
解码结果是%开头双重编码,还差一层 URL 解码继续解 URL 编码
签名比对不一致密钥不对或 payload 部分取错检查分隔符位置、密钥来源
解密出来是乱码没去填充,或 IV 取错检查 PKCS7、IV 长度与位置
报 InvalidTagGCM 模式下标签校验失败检查 nonce 长度是否为 12 字节
解密一半成功一半乱码Base64 里混入了非法字符清洗字符集,只保留合法字符
JWT 解码正常但验签失败密钥不匹配或算法不对对照 header 里的 alg 字段
时间戳过期会话数据超过有效期检查 max_age、exp 字段
key 长度报错AES 密钥不是 16/24/32 字节检查密钥的编码方式(如 hex)
解出来是二进制乱码数据可能是 gzip 或 pickle 序列化先识别序列化格式再处理

表格之外的第一个建议:先确认数据来源是否合法可用。如果这个 Cookie 是从生产环境导出的真实用户数据,请立刻停手,改用测试账号生成的数据。这个习惯我之前反复提醒自己,因为“技术上可行”和“法理上允许”是两回事。

8.2 我的几条长期心得

第一,优先从源码找答案,而不是对着密文猜。很多人拿到密文就开写脚本盲试各种算法,这是效率最低的路径。正确答案通常已经写在服务端代码里,读一行生成代码,胜过猜十次算法。

第二,把解密脚本沉淀成一个小工具库。我后来把自己常用的smart_decode、verify_signed_cookie、aes_cbc_decrypt、decode_jwt_payload都收进了一个私有项目里,遇到新系统时直接调用,不用重复造轮子。工具库的代码要写好注释,因为半年后你可能完全不记得当时的处理逻辑。

第三,警惕会话安全本身的问题。我在处理“解密”时慢慢意识到,很多系统的 Cookie 加密方案其实存在明显破绽:密钥硬编码、直接存手机号、用简单拼接替代正规签名。每次审计后,我都会顺手整理一份加固建议,推动把 Cookie 里敏感信息清理干净、做 HttpOnly 和 Secure 标记、启用密钥定期轮换。

第四,如果你是在排查线上问题时看到这篇内容,给你一个额外的实用提示:在浏览器控制台直接解析当前站点的 Cookie 值,比自己抓包要快得多。脚本如下:

document.cookie.split("; ").forEach(c => { const [name, ...rest] = c.split("="); try { console.log(name, JSON.parse(decodeURIComponent(rest.join("=")))); } catch (e) { console.log(name, decodeURIComponent(rest.join("="))); } });

不过这只能在当前页面上下文里看到 HttpOnly 为 false 的 Cookie。带 HttpOnly 标记的 Cookie 是不会暴露给 JavaScript 的,需要在 DevTools 的 Application 面板里查看,这个特性本身就是一种安全防护,看到带 HttpOnly 标记的 Cookie 时,说明系统在安全方面已经做了正确的事。

关于 Cookie 解密这件事,我个人的体会是:真正值钱的不是“解”的那一下动作,而是对整个会话数据生命周期的理解。你知道它是怎么生成的,知道它用什么保护自己,才能在遇到异常时快速判断出问题出在哪一环。把这些基本功练好,你在联调、排查和安全审视时会比大多数人少走很多弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询