CyberChef 实战用法详解(Recipe 体系核心篇)

CyberChef Recipe 链式操作实战:Base64 互转、压缩令牌还原、日志取证、口令哈希、XOR 分析、JWT 解析、时间戳转换、双重编码还原与 Magic 识别,共 9 条真实链路逐条实测回显,含分享与离线使用。

CyberChefCyberChef安全网络工具2026/10/27

CyberChef 实战用法详解(Recipe 体系核心篇)

目标:以 Recipe(链式操作)为主线,用真实链路把 CyberChef 的日常用法打穿——编码互转、压缩令牌还原、日志取证、口令哈希、密钥异或分析、JWT 解析、时间戳转换、双重编码还原,以及 Magic 未知数据识别。每条链路均给出输入、操作链与真实输出回显(经官方 Node.js 模块实测,与 Web 界面同一套操作实现,Web 界面按相同操作名与参数填写即可复现)。

一、环境信息

项目值
操作系统Ubuntu 22.04(x86_64)
CyberChef 版本v11.5.0(官方最新稳定版,2026-09-18 发布)
Web 形态Nginx 8139 端口自托管(部署过程见《CyberChef 安装与初始化实战》)
程序化形态Node.js v22.23.4 + cyberchef npm 包 11.5.0(官方 Node API)
实测口径bake(输入, [{op, args}, ...]),输出为字符串回显逐行照抄

💡 说明:Web 界面与 Node API 由同一套操作实现驱动,本文所有 Recipe 的 op/args 即 Web 界面中拖入操作后的名称与参数框取值(JSON 形式与界面 Recipe 的导出格式一致);文末「程序化复现」给出把任一链路迁到 Node/脚本的方法。

二、前置条件

  1. 已可访问一份 CyberChef(自托管或官方在线实例 gchq.github.io/CyberChef);
  2. 理解三个概念(详见《CyberChef 配置与模块体系详解》):
    • Operation:单个数据处理步骤,如 From Base64;
    • Recipe:一串按序执行的 Operation,中间结果(Dish)自动流转到下一步;
    • Auto Bake:默认开启的自动重算开关,输入或 Recipe 一变即出结果;
  3. 界面操作节奏:左侧搜索操作名 → 拖入中间 Recipe 区 → 在操作参数框填参数 → 右侧输入框贴数据,输出即时呈现。参数框支持开关(toggleString 类参数,如 XOR 的 Key 同时选格式 Hex/UTF8)、下拉(option)、数字与文本。

三、链路 1:入门——Base64 双向互转

最经典的起步链路,验证部署可用性的标准操作。

编码方向(输入 → 输出):

输入:Hello CyberChef
Recipe:To Base64(参数 Alphabet: A-Za-z0-9+/=,默认值)
输出:SGVsbG8gQ3liZXJDaGVm

解码方向:

输入:SGVsbG8gQ3liZXJDaGVm
Recipe:From Base64(参数 Alphabet: A-Za-z0-9+/=,Remove non-alphabet chars: 开启)
输出:Hello CyberChef

实测脚本与回显(Node API,下同):

await bake('Hello CyberChef', [{ op: 'To Base64', args: ['A-Za-z0-9+/='] }]);
SGVsbG8gQ3liZXJDaGVm

💡 延伸:Alphabet 参数可换变体字母表——JWT 用 URL-safe 字母表 A-Za-z0-9-_=(含 -_ 不含 +/),见链路 6。

四、链路 2:压缩令牌——Gzip+Base64 的 JSON 快照还原

真实场景:故障工单里塞不下大 JSON,团队约定「JSON → Gzip → Base64」压成一行令牌传递。这是 CyberChef 处理「多步可逆变换」的代表性链路。

正向(生成令牌):

输入:{"service":"nginx","status":502,"host":"web01"}
Recipe:Gzip(Compression type: Dynamic Huffman Coding;Filename/Comment 留空)
        → To Base64(默认字母表)
输出:H4sIAHCl4GoA/w3JOwqAMBBF0b3ceooo2GQ3RgZNE8E3fkDce6zPi/y46uJk2lrbg6GY4xR5SqOx7Yrfbi9p4OswZPPwLwAAAA==

逆向(工单接收方还原并取值):

输入:H4sIAHCl4GoA/w3JOwqAMBBF0b3ceooo2GQ3RgZNE8E3fkDce6zPi/y46uJk2lrbg6GY4xR5SqOx7Yrfbi9p4OswZPPwLwAAAA==
Recipe:From Base64 → Gunzip
输出:{"service":"nginx","status":502,"host":"web01"}

继续加第三步,用 JPath expression 直接抽取字段(免人眼找值):

输入:{"service":"nginx","status":502,"host":"web01"}
Recipe:JPath expression(Query: $.host,Result separator: \n,Plumber: 关闭)
输出:"web01"

⚠️ 实测踩坑记录:Gzip 的「Compression type」参数合法值是 Dynamic Huffman Coding / Fixed Huffman Coding / None (Store)(DEFLATE 策略名),不是直觉上的 gzip 字符串——填错直接报错 Compression type must be one of the following: ...;操作真名是 JPath expression,搜 JPath 只出简称,填 JPath 进 Recipe 会报 Couldn't find an operation with name 'JPath'。参数与操作名的权威清单以界面参数框/官方 OperationConfig 为准。

五、链路 3:访问日志取证——URL 反转义与链接提取

真实场景:拿一行 URL 编码的访问日志,还原真实请求并抽出其中全部链接。

输入:GET%20%2Fapi%2Fv1%2Fusers%3Fpage%3D2
Recipe:URL Decode
输出:GET /api/v1/users?page=2
输入:see https://quzuo.net/a?x=1 and http://10.0.0.8:8080/b
Recipe:Extract URLs(Display total: 关闭,默认)
输出:https://quzuo.net/a?x=1
      http://10.0.0.8:8080/b

Extractors 分类同族操作还有 Extract IP addresses、Extract email addresses、Extract domains 等,对大段日志做「信息抽提」时逐个串入 Recipe 即可,配合 Strings(从二进制中拉可打印串)是取证分析的基本组合。

六、链路 4:口令哈希体检——MD5 / SHA-2

真实场景:确认某示例弱口令的哈希落库形态(本文全程使用公共示例口令 q1w2e3r4,不用于任何真实凭据分析)。

输入:q1w2e3r4
Recipe:MD5
输出:c62d929e7b7e7b6165923a5dfc60cb56
输入:q1w2e3r4
Recipe:SHA-2(Size: 256)
输出:13a5c202e320d0bf9bb2c6e2c7cf380a6f7de5d392509fee260b809c893ff2f9

同族实用操作:Analyse hash 粘一段哈希串按长度/字符集猜类型;Generate all hashes 一次出全算法摘要。注意哈希单向不可逆,CyberChef 能做的是「算 + 猜类型」,不能「解哈希」。

七、链路 5:密钥分析——Hex 查看与 XOR 异或

真实场景:安全分析中确认密钥/签名的字节形态,或对异或混淆数据按已知密钥还原。

输入:Secret
Recipe:To Hex(Delimiter: Space,Bytes: 关闭)
输出:53 65 63 72 65 74
输入:Secret
Recipe:XOR(Key: 2a,Key 格式: Hex,Scheme: Standard,Null preserving: 关闭)
输出:yOIXO^

⚠️ 实测踩坑记录:XOR 的 Key 是「文本 + 格式开关」复合参数——Node API 中须传 {string: '2a', option: 'Hex'} 结构;Web 界面上对应 Key 框填 2a 并把旁边开关拨到 Hex。XOR 同类还原:对输出再跑一次相同 XOR 即回原文(异或自反)。

八、链路 6:JWT 结构解析

真实场景:网关排障时看 JWT 头部声明(签名验证不在 CyberChef 场景内)。

输入:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkZW1vIn0.sig
Recipe:Before/After:JWT 三段用 . 分隔,取第一段(配合 Subsection 或手工截取)
        → From Base64(Alphabet: A-Za-z0-9-_= ,URL-safe 字母表)
输出:{"alg":"HS256","typ":"JWT"}

实测回显(对头部段执行 URL-safe 字母表解码):

输入:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Recipe:From Base64(Alphabet: A-Za-z0-9-_=)
输出:{"alg":"HS256","typ":"JWT"}

Web 界面里更顺手的组合是 URL Decode → From Base64(JWT 段若带填充差异可先补齐),或直接搜社区 Recipe;这里展示的是字母表参数的正确取法——用 +/ 字母表解 URL-safe JWT 会因 -_ 字符不在表内而报错或丢字符。

九、链路 7:时间戳批量转换

输入:1793000000
Recipe:From UNIX Timestamp(Units: Seconds (s),Timezone: default (UTC))
输出:Mon 26 October 2026 07:33:20 UTC

毫秒时间戳把 Units 换成 Milliseconds (ms);反向用 To UNIX Timestamp。Fork 搭配可实现逐行批量转换:输入多行时间戳,Recipe 前置 Fork(Split delimiter: \n),每行独立过链。

十、链路 8:双重编码还原(URL 编码 + Base64)

真实场景:日志或配置里出现「URL 编码过的 Base64」,需要剥两层。

正向(制造样本):

输入:CyberChef test
Recipe:To Base64 → URL Encode(Encode all special chars: 开启)
输出:Q3liZXJDaGVmIHRlc3Q%3D

逆向(还原):

输入:Q3liZXJDaGVmIHRlc3Q%3D
Recipe:URL Decode → From Base64
输出:CyberChef test

嵌套更深的样本(Base64(Gzip(Base64(text))))同理由内向外逐层剥——先看末层特征再决定下一步正是 CyberChef 的使用心智;拿不准时用链路 9 的 Magic 先做第一眼判断。

十一、链路 9:Magic 识别未知数据

拿到一段来历不明的数据,第一步挂 Magic:

输入:<未知数据>
Recipe:Magic(Depth: 3,Intensive mode: 关,Extensive language support: 关,Crib: 空)
输出:交互式建议列表(每条 = 建议配方 + 解码结果预览)

Magic 的能力由官方操作测试套件背书:v11.5.0 中 Magic 子测试 17 条全部通过(实测回显 TOTAL 17 / PASSING 17,执行方法见《CyberChef 配置与模块体系详解》第六章)。官方测试断言的典型行为:Hex 字节串 41 42 43 44 45 → 建议配方 From Hex('Space');无特征输入 → 提示 Nothing of interest could be detected about the input data.;mojibake 中文 → 给出字符集修复配方。

⚠️ 实测踩坑记录:Magic 属 Flow control 类操作,官方 Node API 的 bake 明确禁止执行(实测报错 flowControl operations like Magic are not currently allowed in recipes for chef.bake in the Node API),Magic 只在 Web 界面使用;脚本化场景需自行按特征组合解码链。

十二、保存与分享:Recipe 导出与 URL 状态化

CyberChef 的协作核心是把「怎么算」固化下来,三种方式:

  1. URL 携带全部状态(默认开启,对应浏览器端 updateUrl 配置):当前输入与 Recipe 实时编码在地址栏 hash 中(形如 #input=…&recipe=…&args=…),复制整条 URL 发给同事,对方打开即复现链路。发链接前检查 hash 里是否带敏感数据(见下节安全边界)。
  2. Save Recipe:Recipe 区左下 Save 把操作链导出为 JSON 文件;Load Recipe 导入恢复。团队可把标准链路存成 JSON 放进代码库评审,与脚本同源管理。
  3. 浏览器书签:Web 界面的操作收藏(左侧 Favourites 分类)与全局偏好存于浏览器 localStorage,换机器不跟随;跨机器迁移靠方式 1/2。

十三、离线使用与安全边界

离线使用(v11.5.0 发布包实测):

  • 发布包整体解压后(约 80 MB)即自包含:入口页 index.html、主程序 assets/main.js、按需模块 modules/*.js、OCR 语言包等全部在本地,不再发起外部网络请求——静态托管在内网即天然离线可用(首次加载后断网亦可继续操作);
  • 发布包同时带 CyberChef_v11.5.0.html 单文件,实测其 md5 与 index.html 完全一致(都是 75001 字节入口页,引用同目录 assets/main.js)——因此 v11.5.0 的离线使用请保留完整目录结构,不能只拷 HTML 单文件;官方在线实例 gchq.github.io/CyberChef 亦支持「加载一次、断网可用」(官方 README 口径)。

安全边界(选型篇《CyberChef 介绍与选型指南》限制条目的实操展开):

  1. 纯前端架构意味着数据全程留在浏览器内存,不落服务器磁盘——自托管于内网时这是最大优势;
  2. 但 URL 分享(第十二章)会把输入写进浏览器历史与可能的中转日志,敏感数据分享前先清 #input= 段或仅分享 Recipe;
  3. 加密/解密操作用于分析学习,不替代密码库;对不可信来源的数据保持警惕(v11.5.0 的两个安全修复都是针对特定输入的边界问题,及时升级是纪律)。

十四、程序化复现:把链路搬进脚本

本文全部链路已用官方 Node.js 模块逐条验证,脚本化复现方式(《CyberChef 配置与模块体系详解》第八章的环境):

import { bake } from 'cyberchef';

const result = await bake('H4sIAHCl4GoA/w3JOwqAMBBF0b3ceooo2GQ3RgZNE8E3fkDce6zPi/y46uJk2lrbg6GY4xR5SqOx7Yrfbi9p4OswZPPwLwAAAA==', [
  { op: 'From Base64', args: ['A-Za-z0-9+/=', true] },
  { op: 'Gunzip', args: [] },
]);
console.log(result.toString());
// → {"service":"nginx","status":502,"host":"web01"}

三个实测确认的 API 约定:toggleString 类参数传对象 {string, option};Flow control 操作(Magic/Fork 等)被禁止;操作名用官方全名(JPath expression 而非 JPath)。批量处理场景把 bake 放进循环即可,操作实现与 Web 界面逐字节一致。

十五、常见问题(FAQ)

Q1:界面上 Auto Bake 开着,粘贴大文件就卡死? 自动烘焙对大输入会连续触发全链重算。粘贴前先关闭 Auto Bake,整理好 Recipe 后点 Bake 手动执行一次;超大数据(数百 MB 量级,依浏览器内存而定)建议改用 Node API 脚本处理。

Q2:Recipe 拖了很多操作,输出没反应? 检查链路中断点:输出面板红色报错行会指明是第几个操作失败,常见原因是前一步输出类型与下一步输入类型不匹配(如 Gunzip 的输入不是压缩流会报 input buffer is broken)、参数格式选错(见链路 2/5 的踩坑记录)。

Q3:同一个操作名在 Node API 里报 Couldn't find an operation? 用官方全名。界面简称 ≠ 操作注册名(JPath → JPath expression)。权威清单见《CyberChef 配置与模块体系详解》第五章的分类总表或官方 OperationConfig.json。

Q4:分享的 URL 打开后 Recipe 在但输入丢了? 输入独立于 Recipe 编码在 hash 的 #input= 段,中转工具(IM、文档系统)可能截断超长 URL。分享长链路时改用 Save Recipe 导出 JSON 文件。

Q5:想让同事用一模一样的链路但输入各自不同? 分享仅含 Recipe 的 URL 或 JSON(清掉输入段),同事打开后粘贴自己的数据即可;标准链路建议沉淀进团队库统一版本管理。

十六、参考链接