CyberChef实战:505个加密编码操作在离线环境中的落地方法
【免费下载链接】CyberChefThe Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis项目地址: https://gitcode.com/GitHub_Trending/cy/CyberChef
同事发来一段加密数据,编码不明,文件又不能上传到在线工具。CyberChef 把 Base64、AES、十六进制转储这类操作全部放在本地浏览器里执行,还能用 Node.js 脚本批量调用。10 分钟跑起来,浏览器、脚本、深链三种用法都够用。
快速上手:三步在本地跑通 CyberChef
CyberChef 是纯前端项目,没有后端也没有账号,把开发服务器跑起来就能用。
下面的 bash 命令带你从零把 CyberChef 部署到本地,只需要 Node.js 24 及以上版本:
git clone https://gitcode.com/GitHub_Trending/cy/CyberChef cd CyberChef npm install npm start打开http://localhost:8080,你会看到四个区域:左侧是按分类组织的操作列表(支持搜索),右上是输入框,右下是输出框,中间是配方区——把任何操作从左边拖进中间,参数就地填写,输出实时刷新。整个过程不产生任何外发请求,数据始终留在你这台机器上。
核心能力拆解:505 个操作,三种调用入口
CyberChef 的全部 505 个操作都放在src/core/operations/目录里,前端(src/web/)只是把它们包装成拖拽界面。真正决定效率的是三种调用入口怎么选:
| 调用方式 | 入口 | 适合场景 |
|---|---|---|
| 浏览器 | npm start后打开localhost:8080 | 交互式探索、拖拽试错 |
| Node.js API | import chef from "cyberchef" | 写脚本、CI、批量处理 |
| REPL | npm run repl | 快速验证单个操作 |
拖拽配方:最低的上手门槛
拿到一段来路不明的字符串,在左侧搜索框输入base64,把From_Base64拖进配方区,输出框立刻给出解码结果。CyberChef 默认开启 Auto Bake:你每次改动输入或调整参数,整条配方都会自动重跑,不需要手动触发。如果一时判断不出编码类型,可以拖一个Magic操作进来,它会自动尝试识别数据上的编码层;命中时输出框会出现魔法棒图标,点一下就能逐层解开。
Node.js API:把瑞士军刀变成脚本
浏览器适合交互式分析,但日常里更多场景是把 CyberChef 的操作嵌进自己的流水线。Node API 的实现在src/node/api.mjs,所有调用都是同步的,装好npm install cyberchef后即可直接 import:
import chef from "cyberchef"; // Base64 解码,.to("string") 把结果转成可读字符串 const decoded = chef.fromBase64("MTIzNDU2"); console.log(decoded.to("string")); // 参数支持对象形式,比位置参数清晰得多 console.log(chef.fromBase64("MTIz", { alphabet: "A-Za-z0-9+/=" }).to("string"));深链分享:一个 URL 就是一份配方
CyberChef 会把当前配方和输入编码进地址栏,格式类似#recipe=From_Base64('A-Za-z0-9+/=',true)&input=...,其中 input 是 Base64 编码后的内容。把地址栏链接发给同事,他在浏览器打开就能复现你的全部处理步骤,不需要截图、不需要传文件。这也是它适合团队协作的原因:配方本身就是链接。
完整工作流演示:从十六进制转储日志到可读文本 ⚡
用 CyberChef 走一个应急响应里的高频场景:现场设备抓下来的日志是一段十六进制转储(hexdump),里面包着一个 gzip 压缩流,需要还原成明文。
浏览器里的操作路径分四步。第一步,把 hexdump 日志粘贴进右上输入框——第一行开头的1f 8b 08就是 gzip 的魔数,可以先靠它确认方向。第二步,从左侧把From_Hexdump拖进配方区,转储文本被还原成字节流。第三步,在下方再拖入Gunzip,输出框立刻显示解压后的明文。第四步,点 Save recipe 存进本地存储,或直接复制地址栏链接发给同事复现。
如果输入不是文本而是一张扫描图,直接把图片拖进输入框(支持约 2GB 大小的文件),拖入Optical_Character_Recognition操作即可提取文字。仓库自带一张 OCR 测试样本图,可以拿来练手:
同一条流程用 Node 脚本实现,下面这段代码演示了完整的两级处理链:
import chef from "cyberchef"; // 输入:一段 gzip 流的 hexdump(前几字节 1f 8b 08 是 gzip 签名) const input = "00000000 1f 8b 08 00 12 bc f3 57 00 ff 0d c7 ..."; // 第一级:From_Hexdump 把转储还原成原始字节 const bytes = chef.fromHexdump(input); // 第二级:Gunzip 解压,.to("string") 得到可读结果 console.log(chef.gunzip(bytes).to("string"));第一级负责"格式转换",第二级负责"内容还原",两级操作之间通过返回值自然衔接。把这段逻辑套上文件读取和循环,就是一个可以批量处理整目录日志的脚本,而每个操作的具体实现都能在src/core/operations/里找到对应源文件。
进阶技巧与避坑:四个容易翻车的细节 🛡
CyberChef 本地跑得起来之后,真正拉开差距的是下面这些细节。
大文件输入时关掉 Auto Bake
处理超过 100MB 的输入时,先去设置里把 Auto Bake 关掉,改为手动触发烘焙。原因是每次改动都会重跑整条配方,浏览器里同时驻留多份中间结果,内存占用成倍增长。不关的话,大文件一触发重算,标签页内存飙升直到崩溃,输入内容和已配的配方全得重来一遍。
深链分享前把密钥从 URL 里抠掉
深链的 recipe 和 input 都明文躺在 URL 里,分享前务必确认配方参数中没有密钥、口令之类的敏感值。原因是 URL 会残留在浏览器历史、代理日志和聊天记录里,传播范围完全不受你控制。图省事把带 AES 密钥的链接发进群,等于把密钥公开广播,这是新手最常见的泄露路径。
Node API 坚持用对象形式传参
调用chef的操作时,参数尽量写成{ alphabet: "A-Za-z0-9+/=" }这种对象形式。原因是位置参数的顺序很难背,别人读代码时也看不出某个字符串是干什么的;对象形式的 key 自带语义,参考tests/node/tests/nodeApi.mjs里的用例。用位置参数写脚本,顺序一偏,解码结果照样输出一堆乱码却不抛任何错误,排查起来非常消耗时间。
构建报内存不足时先调堆上限
如果npm run build中途报 out-of-memory,先执行npm run setheapsize把 Node 的堆上限调大再重试。原因是 webpack 需要一次性把 505 个操作及其全部依赖打进构建产物,默认堆内存不够用。跳过这一步的话构建会反复失败,很容易误判成代码问题而白白排查半天。
回到开头那份加密文件
开头那份不能外传的加密文件,现在粘贴进输入框、配好操作,答案就显示在屏幕上,全程没有任何数据离开本机。想继续深入的话,两个入口值得马上动手:打开src/core/operations/目录,挑一个像RC4.mjs这样的文件看看单个操作是怎么实现的;或者在终端跑npm run repl,在chef >提示符下随手试几个操作。工具已经摆在本地了,下次再遇到来路不明的数据,你可以先自己过一遍再决定要不要开口求助。
【免费下载链接】CyberChefThe Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis项目地址: https://gitcode.com/GitHub_Trending/cy/CyberChef
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考