openJiuwen MemoryCrypto 解析:记忆引擎 AES-256-GCM 加解密实战指南
人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习【免费下载链接】agent-core-javaopenJiuwen agent core Java是 openJiuwen Core的 Java版本提供AI Agent开发、运行、调优与演进相关的全套SDK能力。项目地址https://gitcode.com/openJiuwen/agent-core-java点击查看免费下载com.openjiuwen.memory.common.MemoryCrypto是 openJiuwen agent-core-java 记忆模块提供的 AES-256-GCM 记忆内容加解密工具用于对写入持久化存储的长期记忆、消息与变量进行落盘加密防止敏感对话内容以明文形式暴露在数据库或 KV 存储中。本文将基于 MemoryCrypto API 文档 的类骨架结合 core 模块的密码学底层实现与 memory 模块的存储接入源码完整讲解其常量定义、加解密行为、密钥配置方式与可验证的工程实践帮助读者在构建 AI Agent 记忆能力时正确启用与验证加密链路。MemoryCrypto 在记忆模块中的定位记忆模块memory工程对应包com.openjiuwen.memory负责 Agent 长期记忆的存取、检索与摘要管理其公共工具包com.openjiuwen.memory.common提供了四类共享基础设施参见 common.README.md类型职责DistributedLock基于BaseKVStore.exclusive_set(...)的同步分布式锁KvPrefixRegistry统一管理记忆模块使用的 KV 前缀MemoryCrypto提供 AES-256-GCM 记忆内容加解密能力MemoryUtils检索命中解析与静态工具方法MemoryCrypto是一个public final类不可继承、不可实例化的工具类形态其声明如下public final class MemoryCrypto它作为记忆模块对外暴露的统一加密入口在调用链上承接两类使用方一类是记忆管理器的按需加解密辅助方法如BaseMemoryManager.encryptMemoryIfNeeded / decryptMemoryIfNeeded另一类是存储编解码器如AesStorageCodec从而让密钥为空则明文透传、配置密钥则静默加密的策略贯穿整个记忆读写路径。常量字段一组与 AES-256-GCM 算法对齐的固定参数MemoryCrypto暴露了四个int类型常量字段字段类型说明NONCE_LENGTHintGCM 模式随机数nonce的长度参数TAG_LENGTHintGCM 认证标签tag的长度参数AES_KEY_LENGTHintAES 密钥的字节长度参数BIT_LENGTHint与位长度相关的换算参数这四个常量并非孤立的数字而是与 core 模块密码学实现的常量严格对齐。在 AesGcmCrypt.java 中可以看到底层取值static final int NONCE_LENGTH 12; // 12 字节 nonce96 位GCM 推荐值 static final int AES_KEY_LENGTH 32; // 32 字节密钥即 AES-256 static final int TAG_LENGTH 16; // 16 字节认证标签128 位CryptUtils将这些常量以public static final形式统一对外公开CryptUtils.java而BIT_LENGTH一类参数在加解密实现中体现为 tag 的位长度换算——例如 AesGcmCrypt.java 中new GCMParameterSpec(TAG_LENGTH * 8, nonce)即使用16 × 8 128位的认证标签位长。从该实现可以推断MemoryCrypto的常量与CryptUtils/AesGcmCrypt出自同一套算法规格保证上层 API 与底层AES/GCM/NoPadding变换的参数完全一致。公开方法encrypt 与 decrypt 的签名与语义MemoryCrypto提供了两个静态方法构成完整的加解密闭环签名说明public static String[] encrypt(byte[] key, String plaintext)执行加密返回密文相关分量public static String decrypt(byte[] key, String ciphertext, String nonce, String tag)基于密钥、密文、nonce 与 tag 执行解密值得注意的两个签名细节encrypt 返回String[]将密文拆分为多个分量返回与AesGcmCrypt的nonce tag ciphertext 三段拼接输出格式见下文相对应调用方可按需组合或持久化decrypt 显式接收nonce与tagGCM 模式解密必须同时提供 nonce 与认证标签缺少任一分量都无法通过完整性校验这从 API 层强制了 GCM 的认证加密AEAD语义。底层实现三段式十六进制密文格式尽管MemoryCrypto.java的类本体在 memory 工程中属于文档描述的公共 API 层其算法落地由 core 模块的 AesGcmCrypt.java 承担。加密流程如下使用SecureRandom生成 12 字节随机 nonce每次加密不重复保证 GCM 安全性以AES/GCM/NoPadding变换、32 字节密钥与 128 位 tag 初始化Cipher对明文 UTF-8 字节执行doFinal得到密文 tag的拼接结果将结果切分为密文与 tag最终输出hex(nonce) hex(tag) hex(ciphertext)的小写十六进制字符串。解密时按nonce(24 位十六进制) tag(32 位十六进制) 剩余密文的顺序切分并回填若密文长度不足、nonce/tag 长度异常或 GCM 完整性校验失败会分别抛出COMMON_ENCRYPTION_ERROR/COMMON_DECRYPTION_ERROR状态码对应的BaseError见 AesGcmCrypt.java。测试 BaseMemoryManagerCryptoTest.java 验证了密文为全小写十六进制、且用错密钥解密必然失败这两条关键性质。可插拔的密码学注册表MemoryCrypto的加密能力通过 CryptUtils.java 维护的全局注册表获取默认注册名为aes_gcmAES_GCM_CRYPT_NAME。CryptUtils.registerCrypt / unregisterCrypt / getCrypt允许在运行时替换或移除加密实现BaseCrypt抽象类BaseCrypt.java定义了encrypt(byte[] key, String origin)与decrypt(byte[] key, String encryptStr)两个抽象方法AesGcmCrypt是其默认的 AES-GCM 实现。这意味着记忆模块的解密逻辑不绑定具体算法为未来算法演进预留了扩展点。密钥配置crypto_key 的字节长度约束MemoryCrypto的密钥由记忆引擎配置项crypto_key提供定义于 MemoryEngineConfig.javaJsonProperty(crypto_key) private byte[] cryptoKey new byte[0];该配置项在校验逻辑上有两条硬性规则MemoryEngineConfig.java密钥必须为空或恰好 32 字节256 位即CryptUtils.AES_KEY_LENGTH其余长度的密钥会直接抛出MEMORY_SET_CONFIG_EXECUTION_ERROR默认值为空字节数组new byte[0]此时整个加密链路处于关闭状态明文透传。对应的单元测试 MemoryConfigModelsTest.java 分别验证了32 字节密钥可正常设置与31 字节密钥抛错两条路径。构建时通过 Builder 或全参构造器传入byte[] key 0123456789abcdef0123456789abcdef.getBytes(StandardCharsets.UTF_8); // 恰好 32 字节 MemoryEngineConfig config MemoryEngineConfig.builder() .cryptoKey(key) .build();加密在记忆引擎中的完整接入链路密钥配置后LongTermMemory会将config.getCryptoKey()分发到各记忆子组件LongTermMemory.javaFragmentMemoryManager、SummaryManager、VariableManager、SearchManager以及消息存储SqlMessageStore均持有该密钥副本。各组件通过以下两条路径实际使用加密路径一存储编解码器AesStorageCodecAesStorageCodec.java 实现了StorageCodec接口在写入存储前encode、读取后decode密钥为空、文本为空或CryptUtils未注册aes_gcm实现时原样返回文本不加密、不报错否则调用crypt.encrypt(key, text)/crypt.decrypt(key, data)加解密异常仅记录MEMORY_PROCESS事件类型的 warning 日志返回原始文本兜底避免存储链路因加密问题整体不可用。VariableManagerVariableManager.java与SqlMessageStoreSqlMessageStore.java均通过new AesStorageCodec(cryptoKey)接入该编解码器。路径二内存管理器的按需加解密BaseMemoryManager.java 提供了一对静态工具方法供各记忆管理器在写入/读取记忆单元时调用public static String encryptMemoryIfNeeded(byte[] key, String plaintext) public static String decryptMemoryIfNeeded(byte[] key, String ciphertext)两者的共同语义是if needed按需密钥为空、输入为空或加密实现缺失时直接透传加密/解密异常时记录 warning 日志并返回原始值。这一设计保证了加密是可选的增强能力未配置密钥的系统行为与未加密时代完全一致。测试验证加密链路的可观察行为与MemoryCrypto直接对应的测试文件为MemoryCryptoTest.java见 common.README.md此外仓库中还提供了多层级的加密行为验证BaseMemoryManagerCryptoTest.java覆盖完整加解密往返、空密钥透传、空串处理、加密实现缺失时的降级返回、密钥不一致时解密必须失败、Unicode 与 emoji 明文往返以及新旧密文格式兼容等 13 个场景AesStorageCodecTest.java验证存储编解码器的 encode/decode 行为CryptUtilsTest.java验证密码学注册表与常量的一致性。其中encryptDecryptWithDifferentKeysFailsBaseMemoryManagerCryptoTest.java直接验证了 GCM 认证标签对密钥错误的强校验使用不同密钥解密必然抛出异常这是认证加密区别于普通 AES 加密的关键安全特性。实践要点与安全建议密钥必须是 32 字节256 位crypto_key过长或过短都会在配置阶段被拒绝测试中常见的合法示例为0123456789abcdef0123456789abcdef32 个 ASCII 字符。加密是可选的、渐进式的能力不配置密钥时全文透传不会破坏已有功能配置密钥后新写入内容即被加密存量明文数据仍可通过decryptMemoryIfNeeded与 legacy 兼容逻辑正常读取见 BaseMemoryManagerCryptoTest.java。GCM 的 nonce 由系统随机生成且每次不同不要自行复用或固定 nonceMemoryCrypto.encrypt返回String[]的原因就在于需要将 nonce/tag 与密文分开管理。密钥即安全边界一旦密钥泄露或丢失密文将无法解密GCM 认证会拒绝任何错误密钥。生产环境应通过密钥管理服务注入crypto_key并留意MemoryEngineConfig的校验逻辑MemoryEngineConfig.java保证配置源头合法。理解异常降级语义加密实现缺失或加解密异常时系统会记 warning 并返回原始数据而非抛错中断这保证了存储链路的可用性优先但应在日志中及时发现Encrypt/Decrypt error via crypt类告警。通过 MemoryCrypto、common.README.md 与本仓库源码对照阅读开发者可以快速定位记忆加密的 API 层、算法层、配置层与存储接入层完整掌握 openJiuwen 记忆引擎的数据加密机制。赞分享人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习【免费下载链接】agent-core-javaopenJiuwen agent core Java是 openJiuwen Core的 Java版本提供AI Agent开发、运行、调优与演进相关的全套SDK能力。项目地址https://gitcode.com/openJiuwen/agent-core-java点击查看免费下载相关推荐openJiuwen agent-core 加密解密抽象层详解CryptUtils 注册表与 AES-256-GCM 实战指南openJiuwen agent core 加密解密抽象层详解CryptUtils 注册表与 AES 256 GCM 实战指南 本篇技术指南深入剖析 open人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习openJiuwen agent-core 通用模块安全加密实践基于 CryptUtils 的 AES-256-GCM 加解密体系解析openJiuwen agent core 通用模块安全加密实践基于 CryptUtils 的 AES 256 GCM 加解密体系解析 导读 本文基于 ope人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习快速用 Etcher 把系统镜像写入 SD 卡和 U 盘安全烧录完整指南快速用 Etcher 把系统镜像写入 SD 卡和 U 盘安全烧录完整指南 EtcherbalenaEtcher是 Balena 出品的开源操作系统镜像烧录桌面应用开发工具智能硬件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

树莓派还是Arduino?跑系统还是跑裸机?从真实项目谈选型

树莓派还是Arduino?跑系统还是跑裸机?从真实项目谈选型

很多刚开始搞硬件开发的朋友,总会拿着一块树莓派和一块 Arduino 问我:“到底买哪个?”几乎所有社区里都会有人甩出一句经典老话:“一个跑系统,一个跑裸机。”听起来很合理,选型好像一下子就清楚了。但这几年…

2026/10/14 17:01:19 阅读更多 →
手动搭建MySQL MHA高可用架构:从主库宕机到自动切换实战

手动搭建MySQL MHA高可用架构:从主库宕机到自动切换实战

1. 为什么手动搭建MHA依然值得学1.1 从一次主库宕机说起凌晨两点,监控告警响了,主库连接数直接掉零。当时我们那套业务用的是单点MySQL,没有做任何高可用。运维同学从被窝里爬起来,手动切从库、改配置、重启服务,前后折…

2026/10/14 17:01:19 阅读更多 →
Oracle 19c RAC on Linux 7.6 安装实战:从环境检查到静默建库

Oracle 19c RAC on Linux 7.6 安装实战:从环境检查到静默建库

简介:面向需要在Red Hat Enterprise Linux 7.6上部署Oracle 19c RAC的DBA与运维工程师,这份安装手册将环境准备与集群配置拆分为可逐步跟做的阶段,涵盖OS环境检查、关闭THP并开启Hugepages、依赖包与内核参数设置、时钟同步等前置任务&#x…

2026/10/14 17:00:18 阅读更多 →

最新新闻

IntelliJ IDEA 的Qoder CN 插件报错“暂时无法同步代码库索引选择”怎么解决?完整排查与修复指南

IntelliJ IDEA 的Qoder CN 插件报错“暂时无法同步代码库索引选择”怎么解决?完整排查与修复指南

摘要 本文针对在IDEA中使用Qoder CN时出现的报错,给出官方说明与实战解决步骤。官方指出需启用代码库索引:可点击“创建”手动启用,或切换“自动索引”。实战中,先登录Qoder CN且不要输入提示词,再进入设置—>Qode…

2026/10/14 17:36:00 阅读更多 →
PTZ-C8T6.zip 云台控制 C 工程解析:编译、协议与避坑指南

PTZ-C8T6.zip 云台控制 C 工程解析:编译、协议与避坑指南

简介:PTZ-C8T6.zip 是一份面向嵌入式开发初学者与 STM32 学习者的云台控制项目工程源码,基于 STM32F103 系列芯片与 HAL 库构建,适合用于课程设计、毕业设计或电赛类云台控制方案的参考与二次开发。压缩包共 98 个文件,约 675KB&a…

2026/10/14 17:36:00 阅读更多 →
Python 读取 Excel 并写入 zip:自动化报表打包实战

Python 读取 Excel 并写入 zip:自动化报表打包实战

简介:这份资源面向需要处理表格数据的Python学习者与开发者,聚焦Excel文件的读取与写入这一常见任务,帮助解决数据分析、数据清洗与自动化报告中的表格操作问题。压缩包共4个文件,全部为py脚本,整体约6KB,涵…

2026/10/14 17:36:00 阅读更多 →
Terminus(Olares)RabbitMQ 中间件集成实战:用 OlaresManifest.yaml 声明式接入消息队列

Terminus(Olares)RabbitMQ 中间件集成实战:用 OlaresManifest.yaml 声明式接入消息队列

云原生后端运维 【免费下载链接】Terminus Open-Source Personal Cloud OS for Always-On Agents 项目地址: https://gitcode.com/gh_mirrors/terminus2/Terminus 点击查看 免费下载 本篇技术指南基于 Terminus 仓库中 RabbitMQ 集成文档 展开,讲解如何…

2026/10/14 17:36:00 阅读更多 →
九轴姿态解算实战:C语言实现Mahony互补滤波与四元数融合

九轴姿态解算实战:C语言实现Mahony互补滤波与四元数融合

简介:九轴姿态解算源代码是一套面向嵌入式开发、无人机及机器人等场景的C语言实现,融合加速度计、磁力计与陀螺仪数据,用于实时估计物体的横滚、俯仰与偏航角。资源包含4个文件,全部为2个C源文件和2个头文件,压缩包仅5…

2026/10/14 17:36:00 阅读更多 →
C#工业级图形面积周长计算:精度、鲁棒性与性能平衡

C#工业级图形面积周长计算:精度、鲁棒性与性能平衡

1. 项目概述:为什么一个“图形周长、面积计算”功能值得花时间深挖? 你可能第一眼看到“C# 图形周长、面积计算”这个标题,会下意识觉得:“不就是几个数学公式封装成方法吗?勾股定理、πr、底高2……抄一遍就完事。”我…

2026/10/14 17:34:59 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →