EdgeChat消息加密指南:AES-256-GCM服务端加密与密钥轮换完整解析
【免费下载链接】Edgechat完全运行于 Cloudflare Worker的现代聊天系统实时通信、Telegram 双向桥接、消息与文件加密 A modern, self-hosted team chat built on Cloudflare — realtime messaging, Telegram bridge, encrypted messages files, and WebMCP. |项目地址https://gitcode.com/gh_mirrors/ed/Edgechat点击查看免费下载EdgeChatEdgeChat 消息加密是一款完全运行在 Cloudflare Worker 上的现代团队聊天系统。它使用AES-256-GCM对消息正文和新上传的附件做服务端静态加密并通过版本化密钥环keyring实现安全的密钥轮换让历史密文在换钥后依然可读。本文带你从零看懂这套 EdgeChat 消息加密方案的原理与配置方法。一、EdgeChat 消息加密整体架构加密发生在哪一层先看一个关键结论EdgeChat 是服务端加密不是端到端加密E2EE。落库前加密用户发送消息时Worker 先通过会话权限校验然后在把内容写入 Cloudflare D1 数据库之前完成 AES-GCM 加密。数据库里存的永远是密文信封而不是明文。读取时解密Worker 在确认请求方有权访问该会话后用密文信封中携带的 key ID 找到对应密钥在内存中解密后返回明文。密钥来自 Secrets密钥不放在代码里而是由部署流程注入为 Worker Secrets密钥环支持多版本并存。核心实现集中在后端加密模块 worker/src/encryption.js消息读写路径在 worker/src/data/messages.js测试覆盖见 worker/src/message-encryption.test.js。 为什么后台看不到消息不等于绝对安全Worker 在权限校验后会在运行环境中解密内容因此 Cloudflare 运行环境和掌握密钥的部署方仍需被信任。管理员后台没有消息正文查看入口但这是产品层面的约束不是技术层面的隔离。二、AES-256-GCM为什么选它EdgeChat 使用 Web Crypto 标准的AES-GCM模式每个密钥固定32 字节256 位见 encryption.js 中的AES_KEY_BYTES 32特性说明认证加密GCM 模式同时提供机密性和完整性校验。密文被篡改哪怕 1 个字节解密会直接失败并抛出authentication failed而不是解出乱码随机 Nonce每次加密都用crypto.getRandomValues生成12 字节随机 IV。即使同一条消息加密两次密文也完全不同关联数据AAD把密文绑定到特定上下文如某个频道、某个文件下载地址把密文挪到别处使用会认证失败硬件级标准AES-256 是目前业界最主流的高强度对称算法Web Crypto 在浏览器和 Worker 中均有原生支持简单说防偷看靠 AES防篡改和防挪位置靠 GCM。三、密文信封格式一条消息在数据库里长什么样1. 消息密文信封加密后的消息正文是一个带前缀的字符串encryption.js#L182-L212edgechat:enc:v1:keyId:Base64(12字节nonce):Base64(密文)字段作用前缀edgechat:enc:v1:/v2:标记这是密文并区分本地用户v1与外部来源用户v2keyId该条消息使用的密钥版本 ID。这是密钥轮换能生效的关键——旧消息带着旧 key ID换钥后照旧可解nonce 密文AES-GCM 标准输出Base64 编码后落库同一个密钥、同一段文字加密两次会产生两条完全不同的密文随机 nonce 保证这一点在 encryption.test.js 中有专门测试验证。2. 文件附件信封附件走二进制信封encryption.js#L355-L382结构为魔数 EDGE01\0 keyId长度 keyId 12字节nonce 密文8 字节魔数EDGE01用于识别这是加密附件没有魔数的旧附件按原始字节直接返回保证历史文件仍可正常下载。上传链路在 worker/src/api/upload.js 中调用encryptAttachment写入 R2下载时在 worker/src/api/upload.js 调用decryptAttachment还原。3. 敏感配置信封Telegram Bot Token、Webhook Secret 等敏感配置同样被加密存入数据库worker/src/data/telegram.js前缀为edgechat:secret:v1:解密入口是 encryption.js#L282-L313 的decryptSecretValue。四、关联数据AAD把密文钉在正确的位置这是 EdgeChat 加密方案中最容易被忽略、但价值很高的一环。加密时每类数据都会附加一段关联认证数据Additional Authenticated Dataencryption.js#L147-L165数据类型绑定内容防住什么攻击消息频道 ID 发送者 ID防止把 A 频道的密文挪到 B 频道的记录里通过认证外部桥接消息频道 ID 外部用户上下文同上适配 v2 信封附件R2 对象键下载地址路径防止同一份密文被替换到其他文件的下载地址敏感配置明确用途标识如 bot-token防止 Bot Token 与 Webhook Secret 的密文互换后仍能被解密测试用例明确验证了这一点把消息改到错误频道解密、把附件换成另一个 objectKey 解密都会抛出authentication failedencryption.test.js#L49-L62、encryption.test.js#L99-L102。五、密钥环Keyring配置多版本密钥如何共存1. JSON 密钥环格式密钥环是一个 JSON 结构activeKeyId指向当前用于新加密的密钥keys里保留所有仍被历史密文引用的旧密钥每项为 Base64 编码的 32 字节密钥{activeKeyId:v1,keys:{v1:BASE64_ENCODED_32_BYTE_KEY}}配置通过名为EDGECHAT_ENCRYPTION_KEYRING的 Secret 注入。加载与校验逻辑在 encryption.js#L107-L137 的loadEncryptionKeyring中密钥长度不是 32 字节、key ID 格式非法、active key 不在 keys 中都会直接报错拒绝启动。2. 自动版本化密钥Worker Secrets 轮换除了 JSON 密钥环EdgeChat 还支持由部署工作流自动管理的版本化 SecretEDGECHAT_ENCRYPTION_KEY_1、EDGECHAT_ENCRYPTION_KEY_2… 会被自动映射为auto-v1、auto-v2… 这样的 key IDencryption.js#L49-L64。首次部署若目标 Worker 尚无加密 Secret工作流会随机生成 32 字节 AES 密钥并记录 active key ID之后的普通部署只检查 Secret 是否存在不会重新生成或覆盖。六、密钥轮换原理为什么旧消息换钥后仍可读这是本方案最优雅的设计。轮换不是重新加密所有历史数据而是新增一个版本化密钥 Secret把 active key ID 切换到新版本所有旧 Secret 与旧 JSON 密钥环原样保留新消息用新密钥加密信封里写入新 key ID旧密文解密时程序读取信封中自带的 key ID从密钥环里找到旧密钥继续解密。┌────────────── 密钥环 Keyring ──────────────┐ │ activeKeyId: v2 ← 新消息用 v2 加密 │ │ keys: { v1: 旧密钥, v2: 新密钥 } │ └────────────────────────────────────────────┘ ↑ ↑ 旧消息信封 keyIdv1 新消息信封 keyIdv2 用 v1 解密仍然成功 用 v2 解密对应测试 encryption.test.js#L64-L85 完整覆盖了轮换后旧数据可解 增量新增密钥不破坏旧密钥环两个场景。两种轮换操作方式方式操作特点自动增量轮换手动运行Deploy Worker并勾选rotate_encryption_key只新增一个版本化密钥 Secret 并切换 active key ID旧 Secret 全部保留推荐方式手动覆盖密钥环使用apply_encryption_keyring在 Repository Secret 中提供完整 JSON 密钥环备用入口。keys必须保留所有仍被历史密文引用的旧 key ID再新增 key 并更新activeKeyId⚠️两条红线删除旧 key 会导致对应历史密文永久无法读取——轮换时切记保留旧密钥。apply_encryption_keyring与rotate_encryption_key不能在同一次部署运行中同时启用。七、历史明文兼容不回填、不迁移EdgeChat 对部署前已存在的明文数据采取原样保留策略读取时发现内容不带密文前缀就按明文直接返回encryption.js#L214-L223既不回写数据库也不触发后台批量加密任务只有新写入的消息和新上传的附件才被加密encryption.js#L384-L389。这样做的好处是升级零风险、不产生大规模数据迁移负载代价是历史数据仍是明文存储新数据才是密文。测试用例见 encryption.test.js#L45-L47。八、快速上手清单确认部署时EDGECHAT_ENCRYPTION_KEYRING等加密 Secret 已存在首次部署自动生成无需手动准备需要手动指定密钥时创建合法 JSON 密钥环{activeKeyId:v1,keys:{v1:Base64 32字节密钥}}轮换密钥运行Deploy Worker并勾选rotate_encryption_key切勿在轮换后删除旧 key ID记住边界这是服务端加密开启 Telegram 桥接后被转发的消息还会进入对应 Telegram 会话总结EdgeChat 的消息加密方案可以浓缩成一句话用 AES-256-GCM 把每条消息和每个附件加密成自带 key ID 的信封用关联数据把密文钉死在原始上下文再用多版本密钥环实现只加不改的平滑轮换。对新手而言你只需要记住三件事数据库和 R2 里存的是密文密钥在 Secrets 里每条密文自带 key ID所以换钥不丢历史消息轮换时永远保留旧密钥删了旧 key 历史密文永久不可读。更多实现细节可参考 worker/src/encryption.js 源码、worker/src/encryption.test.js 测试以及主文档 README.md 中隐私与加密章节。赞分享【免费下载链接】Edgechat完全运行于 Cloudflare Worker的现代聊天系统实时通信、Telegram 双向桥接、消息与文件加密 A modern, self-hosted team chat built on Cloudflare — realtime messaging, Telegram bridge, encrypted messages files, and WebMCP. |项目地址https://gitcode.com/gh_mirrors/ed/Edgechat点击查看免费下载相关推荐Serf 安全模型深度解析AES-256-GCM 对称加密、消息格式、威胁模型与密钥轮换机制Serf 安全模型深度解析AES 256 GCM 对称加密、消息格式、威胁模型与密钥轮换机制 Serf 集群采用对称密钥共享密钥密码系统为节点间的全部网服务注册发现云原生集群管理Apache Pulsar 端到端加密PIP-4实战指南基于 ECDSA/RSA 与 AES-256-GCM 的消息加解密实现Apache Pulsar 端到端加密PIP 4实战指南基于 ECDSA/RSA 与 AES 256 GCM 的消息加解密实现 本文以 Apache Pu消息队列流处理后端微服务消息路由如何快速创建专业级Arcaea谱面开源编辑器的完整指南如何快速创建专业级Arcaea谱面开源编辑器的完整指南 你是否梦想创作属于自己的Arcaea谱面却苦于找不到合适的工具Arcade plus正是你需要的解游戏开发开发工具桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

运维面试七条线:从Linux到K8s核心考点详解

运维面试七条线:从Linux到K8s核心考点详解

简介:面向运维工程师岗位面试的一套 PDF 题库,聚焦 Linux、Shell、Python、MySQL、Docker、K8s 与网络七大技术方向,适合正在系统准备运维/DevOps 面试的求职者快速查漏补缺。资源仅包含 1 个 PDF 文件,大小约 890KB,内…

2026/10/16 17:13:18 阅读更多 →
破解搜索盲区:生成式引擎如何让AI商用手机从‘搜不到‘到‘被选择‘

破解搜索盲区:生成式引擎如何让AI商用手机从‘搜不到‘到‘被选择‘

1. 搜索盲区为什么成了AI商用手机的第一拦路虎先说一个让我印象很深的对比。某次行业交流会上,一位做企业采购的朋友被问到一个很简单的问题:既然市面上已经出现了AI商用手机品类第一名,为什么你在搜索平台上搜"AI营销手机"&#x…

2026/10/16 17:13:18 阅读更多 →
R语言离线安装ggplot2 zip包全指南:依赖处理与版本验证

R语言离线安装ggplot2 zip包全指南:依赖处理与版本验证

简介:ggplot2_3.3.0.zip是R语言数据可视化包ggplot2的3.3.0离线安装版,专为需要在无网络或网络不稳定环境中部署绘图工具的数据分析师、科研人员及R初学者准备,可一次性完成本地安装。压缩包共40个文件,总大小3.83MB,其…

2026/10/16 17:12:17 阅读更多 →

最新新闻

MATLAB EMD工具箱实战:从经验模态分解到HHT时频分析

MATLAB EMD工具箱实战:从经验模态分解到HHT时频分析

简介:Matlab EMD经验模态分解工具箱,面向信号处理、故障诊断与振动分析领域的研究人员与工程师,用于对非线性、非平稳信号做自适应分解并提取有物理意义的本征模态函数分量。压缩包共38个文件,其中10个m脚本承担核心算法与在线/局…

2026/10/16 19:42:22 阅读更多 →
教务管理系统源码解析:技术选型、数据库设计与二次开发避坑指南

教务管理系统源码解析:技术选型、数据库设计与二次开发避坑指南

简介:这是一套面向计算机专业学生与Java Web开发者的教务管理系统完整源码,适合作为课程设计、毕业设计或企业级项目练手参考,帮助理解教育管理信息化的业务逻辑与技术落地。资源包共746个文件,约5.46MB,涵盖html、css…

2026/10/16 19:42:22 阅读更多 →
E7-2 AXOS everyPON 数据服务实施:从订户模板到策略映射实战指南

E7-2 AXOS everyPON 数据服务实施:从订户模板到策略映射实战指南

简介:Calix E7-2 AXOS everyPON数据服务实施课程的官方介绍文档,面向负责二层数据服务部署的技术员、网络运营者、规划师与工程师。资源包内仅含1个PDF文件,容量74KB,以精炼篇幅浓缩了4小时讲师授课的核心内容:E7-2 AX…

2026/10/16 19:42:22 阅读更多 →
gemma-skills新手必读:Google官方两大技能如何让AI Agent具备Gemma开发与微调能力

gemma-skills新手必读:Google官方两大技能如何让AI Agent具备Gemma开发与微调能力

【免费下载链接】gemma-skills Skills for the Gemma and model/agent interactions 项目地址: https://gitcode.com/gh_mirrors/ge/gemma-skills 点击查看 免费下载 如果你是刚接触 Gemma 模型的新手,gemma-skills 会是一个绝佳的起点。这是 Google 官…

2026/10/16 19:41:22 阅读更多 →
DeepSeek-V3-W4A8-Pruing权重文件怎么读?safetensors三分片结构与index索引完全解析

DeepSeek-V3-W4A8-Pruing权重文件怎么读?safetensors三分片结构与index索引完全解析

【免费下载链接】DeepSeek-V3-W4A8-Pruing 项目地址: https://ai.gitcode.com/hf_mirrors/vllm-ascend/DeepSeek-V3-W4A8-Pruing 点击查看 免费下载 初次接触 DeepSeek-V3-W4A8-Pruing 模型仓库时,面对 3 个 safetensors 分片文件、一个 578KB 的 index…

2026/10/16 19:41:22 阅读更多 →
整车控制器开发源代码:模块划分、状态机设计与工程落地

整车控制器开发源代码:模块划分、状态机设计与工程落地

简介:整车控制器(VCU)开发源代码包主要面向电动汽车与混合动力汽车控制系统的开发者、算法工程师及嵌入式软件研究者,用于解决VCU底层驱动、控制策略、状态机管理与故障处理等核心开发问题。包内文件共88个,以C源文件、…

2026/10/16 19:40:21 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →