安全
安全是 OxideTerm 设计的核心优先事项。整个 SSH 协议栈为纯 Rust(russh + ring),从根本上消除了 C 内存安全漏洞。本页介绍已实施的安全措施。
纯 Rust 密码学
Section titled “纯 Rust 密码学”OxideTerm 使用 russh 0.54 配合 ring 加密后端:
- 零 C/OpenSSL 依赖 — 完整加密栈均为 Rust 实现。不再有 “哪个 OpenSSL 版本?” 的调试烦恼
- 完整 SSH2 协议:密钥交换、通道、SFTP 子系统、端口转发
- ChaCha20-Poly1305 和 AES-GCM 密码套件
- 这消除了与 C 内存安全问题相关的一整类漏洞(缓冲区溢出、释放后使用等)
包含敏感数据的内存使用 zeroize crate 在使用后安全清除。
操作系统钥匙串
Section titled “操作系统钥匙串”所有敏感凭证存储在 操作系统原生钥匙串 中:
| 平台 | 钥匙串 |
|---|---|
| macOS | 钥匙串访问 |
| Windows | Windows 凭据管理器 |
| Linux | Secret Service API(GNOME Keyring / KWallet) |
密码、私钥口令和 API 密钥 绝不 存储在配置文件、数据库或明文中。
AI API 密钥
Section titled “AI API 密钥”OxideSens AI API 密钥存储在操作系统钥匙串的 com.oxideterm.ai 服务下,与 SSH 凭证分开存储。
在 macOS 上,密钥读取受 Touch ID 保护(通过 LAContext):
- 无需 entitlements 或代码签名
- 每次会话首次认证后缓存——只需认证一次
- 提供硬件级访问控制,无需额外配置
连接导出加密
Section titled “连接导出加密”用于分享连接配置的 .oxide 导出格式使用:
- ChaCha20-Poly1305 — AEAD(带关联数据的认证加密)
- Argon2id — 内存硬化 KDF(密钥派生函数)
- 256 MB 内存开销
- 4 次迭代
- 抵抗 GPU/ASIC 暴力破解
- SHA-256 完整性校验和
- 敏感字段单独加密
- 非敏感元数据(主机名、标签)可选择保持明文以便组织管理
- 可选密钥嵌入 — 私钥可 base64 编码后嵌入加密载荷
- 预检分析 — 导出前,OxideTerm 分析认证类型并检测缺失的密钥,让你清楚知道将导出什么内容
包含敏感数据的内存使用 zeroize 进行安全清除。
SSH 安全
Section titled “SSH 安全”主机密钥验证
Section titled “主机密钥验证”OxideTerm 实现 TOFU(首次使用时信任):
- 首次连接:接受并存储主机密钥
- 后续连接:与已存储的密钥进行验证
- 拒绝主机密钥变更 — 防止中间人攻击
- 使用
~/.ssh/known_hosts,与 OpenSSH 兼容
支持的密钥类型
Section titled “支持的密钥类型”- Ed25519(推荐——最快、最小的密钥)
- ECDSA(P-256, P-384)
- RSA(最低 2048 位)
- SSH 证书 — 完整的基于证书的认证支持
SSH Agent 集成
Section titled “SSH Agent 集成”OxideTerm 支持系统 SSH Agent 进行密钥管理:
| 平台 | Agent |
|---|---|
| macOS/Linux | SSH_AUTH_SOCK Unix Socket |
| Windows | \\.\pipe\openssh-ssh-agent Named Pipe |
功能:
- 重连时自动重放 Agent 认证
- 每个 ProxyJump 跳板可独立使用 Agent 认证
- 自定义
AgentSigner实现封装系统 Agent 并满足russh的Signertrait
WebSocket 安全
Section titled “WebSocket 安全”内部 WebSocket 连接(前端和 Rust 后端之间)通过以下方式保护:
- 首帧进行 令牌认证
- 一次性令牌,带有时间限制——令牌不可重复使用
- 连接仅限本地(localhost 绑定)
- 服务端每 30 秒发送心跳;5 分钟超时容忍 macOS App Nap 和浏览器 JS 节流
插件系统使用多层安全机制:
| 层次 | 机制 |
|---|---|
| 冻结 API | 所有 PluginContext 对象通过 Object.freeze() 冻结——插件无法修改或猴子补丁 API |
| Proxy ACL | 每个命名空间访问都根据声明的权限进行验证 |
| IPC 白名单 | 插件只能调用白名单中的 Tauri 命令 |
| 熔断器 | 多次运行时错误后自动禁用 |
| 错误边界 | React 错误边界将插件 UI 崩溃与主应用隔离 |
插件在渲染进程中运行,系统访问权限有限——没有 PluginContext API 之外的直接文件系统或网络访问。
内容安全策略
Section titled “内容安全策略”Tauri 应用使用 null CSP。不加载外部 Web 内容——所有 UI 均从本地二进制文件提供。任何新的 Web 内容暴露都应仔细审查。
- 无遥测 — OxideTerm 不收集或传输使用数据
- 无云服务 — 所有数据留在你的设备上
- 本地优先 — AI 功能自带密钥
- 显式数据发送 — 终端缓冲区数据仅在你主动请求时(点击 Context 按钮并发送消息)才发送给 AI 服务商
- 本地 AI — 通过 Ollama 使用本地模型,AI 查询零网络流量
- redb 存储 — 所有持久化数据(会话、设置、聊天记录)存储在本地嵌入式键值数据库中