news 2026/9/15 11:04:37

OpenRAG 加密实现剖析:OAuth凭证安全存储的完整方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenRAG 加密实现剖析:OAuth凭证安全存储的完整方案

OpenRAG 加密实现剖析:OAuth凭证安全存储的完整方案

【免费下载链接】openragOpenRAG is a comprehensive, single package Retrieval-Augmented Generation platform built on Langflow, Docling, and Opensearch.项目地址: https://gitcode.com/GitHub_Trending/open/openrag

OpenRAG 是基于 Langflow、Docling 和 OpenSearch 构建的开源检索增强生成(RAG)平台。它内置了一套完整的OpenRAG 加密体系:使用 AES-256-GCM 算法对 OAuth 凭证、模型 API Key、连接器令牌缓存等敏感数据进行加密存储,让密钥和凭据在磁盘上以密文形式存在,为新手也提供了企业级的安全存储方案。本文将带你读懂这套方案的完整实现。

一、OpenRAG 加密体系全景 🗂️

OpenRAG 将云盘文件(Google Drive、OneDrive、SharePoint)摄入知识库时,需要保存大量凭证:OAuth 令牌、客户端密钥、云存储 API Key 等。如果这些明文落盘,任何能读取数据卷的人都可能窃取你的账号权限。

OpenRAG 的解决方案是:所有敏感字段统一走一个加密信封(envelope),落盘前加密、读取时解密,并额外用租户 ID 做防篡改绑定。

加密体系覆盖四大落点:

落点保护对象相关模块
模型提供商配置OpenAI 等 API Keysrc/config/config_manager.py
连接器连接凭证client_secret、云存储密钥src/connectors/base.py
OAuth 令牌缓存Google Drive / OneDrive / SharePoint 令牌文件src/connectors/sharepoint/oauth.py
工作区 OAuth 覆盖配置管理员在 UI 中设置的客户端密钥src/services/connector_oauth_config_service.py

二、主密钥从哪来:OPENRAG_ENCRYPTION_KEY 一键生成 🔑

整套加密的根是一个环境级主密钥OPENRAG_ENCRYPTION_KEY,由 src/utils/encryption.py 中的get_master_secret()读取并进程内缓存。

  • 自动生成:运行 TUI 或 CLI 配置向导时会自动生成一个 32 字节 Base64 密钥,新手无需手写任何密码学配置;
  • 托管可选:开启IBM_AUTH_ENABLED后,可从 IBM Secrets Manager 拉取解密密钥,失败时自动回退到本地OPENRAG_ENCRYPTION_KEY
  • 强制校验:设置OPENRAG_ENFORCE_PREREQUISITES=true后,若主密钥缺失,应用会拒绝以未加密模式启动(见 src/utils/encryption.py)。

⚠️ 注意:主密钥一旦丢失或轮换,已加密的凭证将无法解密,官方文档在 docs/docs/reference/configuration.mdx 中明确提醒了这一点。

三、核心算法:AES-256-GCM + PBKDF2 密钥派生 🔐

核心实现集中在 src/utils/encryption.py,流程非常清晰:

  1. 密钥派生:用PBKDF2HMAC-SHA256从主密钥派生出 32 字节 AES 密钥,盐值每次加密随机生成(16 字节),迭代 10 万次,抗暴力破解;
  2. 加密:使用AES-256-GCM认证加密,随机 12 字节 nonce 保证同一明文每次密文不同;
  3. 租户绑定:将tenant_id作为 GCM 的附加认证数据(AAD)绑定进密文,解密密文时必须租户匹配,否则认证失败——这就是"加密信封"的防篡改能力;
  4. 信封格式:密文与元数据一起打包成 JSON 字典落盘,字段如下:
字段作用
algorithm固定为AES-256-GCM,解密时先校验
kdfPBKDF2HMAC-SHA256派生方式标识
tenant_id租户绑定,参与 AAD 构造
salt/nonceBase64 编码的随机盐与随机数
ciphertextBase64 编码的 GCM 密文(含认证标签)

单元测试 tests/unit/test_encryption.py 专门验证了一个细节:伪造租户 ID 去解密会被 AES-GCM 认证标签直接拒绝,从机制上杜绝了跨租户窃取密文的可能。

四、四大加密落点是怎么工作的 💾

4.1 模型提供商 API Key

ConfigManager 保存 YAML 配置前,会自动把 providers 下的api_key及各提供商凭证字段调用encrypt_secret()加密(见 src/config/config_manager.py)。磁盘上的 YAML 里只剩加密信封,读回时透明解密,对上层代码完全无感。

4.2 连接器连接凭证

每个连接器通过SECRET_CONFIG_KEYS声明哪些配置键需要加密。保存连接(如 Google Drive 的client_secret、S3 的secret_key)时,ConnectionManager 只对这些键加密,非敏感字段原样保存。测试文件 tests/unit/test_encryption.py 展示了加密后的connections.json结构:只有密钥字段变成了AES-256-GCM信封。

4.3 OAuth 令牌缓存文件(重点)🎯

这是 OAuth 凭证安全存储的核心场景。以 SharePoint 为例:

  • 写入:save_cache() 把 MSAL 令牌缓存序列化后,统一交给 write_encrypted_file() 加密落盘;
  • 读取:load_credentials() 通过 read_encrypted_file() 读取,自动识别密文信封并解密,再用OPENRAG_TENANT_ID作为期望租户校验 AAD;
  • Google Drive、OneDrive 走同样的路径(见 tests/unit/test_oauth_encryption.py)。

4.4 工作区级 OAuth 客户端凭证

管理员可以在 UI 中为各 OAuth 连接器覆盖client_id / client_secret。set_oauth_config() 会把client_secret加密后存入工作区配置表;查询状态接口则永远不返回解密后的密钥,只提示密钥来源是"覆盖值"还是"环境变量",兼顾了安全与可观测性。

五、向后兼容与自动升级 🔄

OpenRAG 的加密设计非常照顾存量用户:

  • 未设置主密钥时encrypt_secret()返回明文,系统保持旧行为,不会因升级而瘫痪;
  • 自动升级:read_encrypted_file() 返回needs_upgrade标志——当检测到明文旧文件且主密钥已就绪,读取后的首次保存会顺手把文件加密(test_auto_upgrade_features用例验证了此行为);
  • 旧格式兼容:解密端同时支持早期"32 字节原始 Base64 密钥"的历史格式,见 src/utils/encryption.py。

六、总结 ✅

OpenRAG 的加密实现可以用一句话概括:一把主密钥、一个加密信封、四个落点、租户绑定防篡改

  • 对新手:TUI 向导一键生成OPENRAG_ENCRYPTION_KEY即获得全套保护,无需理解任何密码学细节;
  • 对进阶用户:AES-256-GCM + PBKDF2(10 万轮)的组合、每次随机的盐/nonce、AAD 租户绑定、明文降级与自动升级策略,构成了一个既严谨又务实的生产级方案。

想深入了解,推荐阅读源码 src/utils/encryption.py 与官方配置文档 docs/docs/reference/configuration.mdx。

【免费下载链接】openragOpenRAG is a comprehensive, single package Retrieval-Augmented Generation platform built on Langflow, Docling, and Opensearch.项目地址: https://gitcode.com/GitHub_Trending/open/openrag

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 11:04:31

Umi 开启 MFSU 后浏览器出现 React 多实例问题怎么解决

Umi 开启 MFSU 后浏览器出现 React 多实例问题怎么解决 【免费下载链接】umi A framework in react community ✨ 项目地址: https://gitcode.com/GitHub_Trending/um/umi 在 Umi 项目开发中,如果浏览器控制台报出 React 多实例错误(React 的代码…

作者头像 李华
网站建设 2026/9/15 11:03:13

JuiceFS 如何用 fio 跑顺序读写基准测试并解读结果

JuiceFS 如何用 fio 跑顺序读写基准测试并解读结果 【免费下载链接】juicefs JuiceFS is a distributed POSIX file system built on top of Redis and S3. 项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs 已经挂载好的 JuiceFS 文件系统能跑多快的顺序读写…

作者头像 李华
网站建设 2026/9/15 11:02:56

Python开发个人日程管理系统的设计与实现

1. 项目概述"Python个人日程计划管理系统"是一个基于Python开发的轻量级个人时间管理工具。作为一名长期使用Python进行自动化开发的程序员,我发现在日常工作和生活中,市面上大多数日程管理软件要么功能过于复杂,要么缺乏灵活性。于…

作者头像 李华
网站建设 2026/9/15 11:02:39

抖音批量下载工具:一键无水印下载的完整指南

抖音批量下载工具:一键无水印下载的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批…

作者头像 李华