Skip to content

Shawn-TKD/aeterna_

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Aeterna

端到端加密的数字信托与隐私托管平台 | End-to-End Encrypted Digital Trust & Privacy Custody Platform

License: MIT Beta

Aeterna 是一个注重隐私和安全的数字信托托管平台。通过零知识加密架构和心跳监测机制,确保您的重要信息在 90 天失联后安全传递给指定的收信人。所有加密操作在浏览器端完成,服务器仅存储密文,真正实现零知识安全。

✨ 核心特性

🔐 零知识加密架构

Aeterna 采用客户端加密方案,确保服务器对用户数据一无所知。密钥对在浏览器中生成,私钥由用户下载保管,服务器仅存储加密后的密文。即使数据库完全泄露,攻击者也无法解密任何内容。

技术实现:使用 ECC (椭圆曲线加密) 生成密钥对,采用 AES-GCM 对称加密保护信托内容,私钥以 PKCS#8 格式导出并由用户离线保管。图片自动转换为 Base64 后加密,确保完整性。

💓 智能心跳监测

系统自动追踪用户活跃状态,每次登录更新心跳时间戳。当用户连续 90 天未登录时,系统将自动向指定收信人发送加密信托包。在失联前的第 75、83、89 天,系统会发送提醒邮件,用户可通过邮件链接重置心跳,避免误触发。

工作原理:后台定时任务每日扫描心跳记录表,计算距离上次活跃的天数。分阶段邮件提醒让用户有充足时间响应,确保只在真正失联时触发分发。

📝 邮件风格编辑器

参考主流邮件客户端设计的三段式布局,让信托创建过程直观易懂。用户可以创建多份独立的信托(最多 2 份),为每份信托指定不同的收信人(最多 2 位),支持富文本编辑和图片上传。主题和正文分离,信息层次清晰。

使用限制:为确保服务质量和存储成本,每个用户最多创建 2 条信托,最多添加 2 位收信人。这些限制在后端和前端都有强制执行。

🔓 公开解密页面

收信人无需注册或登录,可直接访问解密页面。支持文本粘贴和文件拖拽两种输入方式,所有解密操作在浏览器端完成,保护隐私。解密前会先显示加密密文预览,证明数据确实存在且未被篡改。

安全设计:解密页面不与服务器通信,所有操作都在本地完成。收信人需要同时拥有私钥和加密数据包才能解密,确保双因素保护。

🎓 新手引导系统

首次登录的用户会看到 5 步交互式引导流程,帮助理解完整使用流程。引导包括:欢迎页流程图、创建信托演示、强制私钥下载、添加收信人指导、以及发送私钥给收信人的最佳实践。引导完成后使用 localStorage 持久化状态,不会重复显示。

设计理念:通过渐进式引导降低学习成本,强制私钥下载环节确保用户不会遗漏关键步骤。用户可以选择跳过引导(带确认提示),但建议完整体验以理解平台工作原理。

🛡️ 管理后台

管理员可以通过 /admin 路径访问后台,查看用户监控、信托列表、收信人列表、邮件队列等信息。支持单个删除和批量删除操作,以及用户删除功能(级联删除所有关联数据)。管理员权限通过邮箱白名单控制,确保只有授权人员可以访问。

权限控制:管理员邮箱在后端代码中硬编码,登录时自动识别并赋予 admin 角色。管理后台入口隐藏,需要直接访问 URL 才能进入。

🏗️ 技术架构

适配器模式设计(跨平台部署)

架构理念:Aeterna 采用适配器模式(Adapter Pattern)解耦平台依赖,实现跨平台部署能力。通过抽象层定义统一接口,不同平台的具体实现作为可替换的适配器,开发者可以通过环境变量快速切换认证和存储方案。

支持的平台

功能模块 支持的平台 环境变量配置
认证 Manus OAuth(默认)
Supabase Auth
Clerk
AUTH_PROVIDER=manus
AUTH_PROVIDER=supabase
AUTH_PROVIDER=clerk
存储 Manus S3(默认)
AWS S3
Cloudflare R2
本地文件系统
STORAGE_PROVIDER=manus-s3
STORAGE_PROVIDER=aws-s3
STORAGE_PROVIDER=cloudflare-r2
STORAGE_PROVIDER=local

部署灵活性

  • ✅ 5 分钟切换认证方案(修改 1 行环境变量)
  • ✅ 10 分钟切换存储方案(修改 1 行环境变量)
  • ✅ 支持 Vercel、Railway、Docker、自建服务器等多种部署方式
  • ✅ 开发环境可使用本地存储,生产环境使用云服务

详细的部署指南请参考 DEPLOYMENT.md

前端技术栈

框架与工具:React 19 提供现代化的组件开发体验,TypeScript 确保类型安全,Wouter 作为轻量级路由解决方案。Tailwind CSS 4 配合 shadcn/ui 组件库实现一致的视觉风格。

状态管理与通信:TanStack Query (React Query) 处理服务器状态缓存和同步,tRPC 11 提供类型安全的端到端 API 通信,无需手动编写 API 类型定义。

后端技术栈

运行时与框架:Node.js 22+ 配合 Express 4 提供稳定的服务器环境。支持 MySQL、PostgreSQL 等多种数据库,Drizzle ORM 提供类型安全的数据库操作。

认证与会话:默认使用 Manus OAuth 实现无密码邮箱登录,用户通过 Magic Link 验证身份。JWT 令牌存储在 HTTP-only Cookie 中,防止 XSS 攻击。也可切换到 Supabase Auth 或 Clerk。

加密实现

密钥生成:使用 Web Crypto API 的 ECDH P-256 算法在浏览器中生成密钥对。私钥以 PKCS#8 格式导出为 PEM 编码文件,用户下载保管。

内容加密:采用 AES-GCM 256-bit 对称加密算法,提供认证加密(AEAD)特性。加密后的数据包含密文、初始化向量(IV)和认证标签,全部使用 Base64 编码存储。

📊 数据库设计

表名 说明 关键字段
users 用户表 id, email, name, role (admin/user), created_at
heartbeats 心跳记录表 id, user_id, last_active_at, status, updated_at
wills 信托表 id, user_id, subject, encrypted_content, recipient_ids (JSON), public_key, encrypted_aes_key, iv
emergency_contacts 收信人表 id, user_id, name, email, relationship, created_at
email_queue 邮件队列表 id, recipient_email, subject, body, status, scheduled_at

关系设计:用户与信托、收信人、心跳记录都是一对多关系。信托表的 recipient_ids 字段存储 JSON 数组,支持一份信托发送给多位收信人。删除用户时级联删除所有关联数据。

🚀 快速开始

环境要求

  • Node.js: 22.13.0 或更高版本
  • 包管理器: pnpm (推荐) 或 npm
  • 数据库: PostgreSQL 14+ 或 Supabase

安装步骤

1. 克隆项目

git clone https://github.com/yourusername/aeterna.git
cd aeterna

2. 安装依赖

pnpm install

3. 配置环境变量

创建 .env 文件并配置以下变量:

# 数据库连接
DATABASE_URL=postgresql://user:password@host:5432/database

# OAuth 配置 (Manus)
VITE_APP_ID=your_app_id
OAUTH_SERVER_URL=https://api.manus.im
VITE_OAUTH_PORTAL_URL=https://oauth.manus.im

# JWT 密钥
JWT_SECRET=your_jwt_secret_min_32_chars

# 管理员邮箱 (可选,在代码中配置)
# 在 server/db.ts 中的 ADMIN_EMAILS 数组添加管理员邮箱

4. 初始化数据库

pnpm db:push

5. 启动开发服务器

pnpm dev

访问 http://localhost:3000 查看应用。

📖 使用指南

首次使用(新手引导)

首次登录后,系统会自动显示 5 步交互式引导:

  1. 欢迎页:了解平台的 3 步核心流程(创建信托 → 保存私钥 → 添加收信人)
  2. 创建信托:体验信托创建表单(演示用,不会真正保存)
  3. 下载私钥:强制下载演示私钥文件,理解私钥的重要性
  4. 添加收信人:了解如何指定信托接收人
  5. 发送私钥:学习如何安全地将私钥发送给收信人

完成引导后,可以开始正式使用平台。如需重新查看引导,可以清除浏览器 localStorage 中的 onboarding_completed 标志。

创建信托

步骤说明

  1. 登录账户:使用邮箱接收 Magic Link 登录,无需密码
  2. 添加收信人:在"管理联系人"页面添加接收人(最多 5 位)
  3. 创建信托:点击"我的信托"→"创建新信托"
  4. 填写内容:选择收件人、填写主题和正文、可选上传图片
  5. 生成密钥:首次创建时自动生成密钥对
  6. 下载私钥:务必下载并安全保存私钥文件(丢失无法找回)
  7. 加密保存:点击"加密并保存"完成创建

重要提示:每个用户最多创建 2 条信托。私钥是解密信托的唯一凭证,丢失后无法恢复。建议多地备份(离线存储、保险箱等)。

查看和编辑信托

查看流程

  1. 进入"我的信托"页面,查看已创建的信托列表
  2. 点击要查看的信托,默认显示加密密文预览
  3. 点击"输入私钥解密查看",粘贴私钥内容
  4. 解密后显示完整内容和图片

编辑信托:点击信托列表中的"Edit"按钮,修改后重新加密保存。编辑时需要输入私钥进行解密。

收信人解密信托

解密步骤

  1. 访问解密页面:从邮件链接或直接访问 /decrypt
  2. 准备材料:需要私钥文件和加密数据包(JSON 格式)
  3. 上传文件:拖拽或粘贴私钥和加密数据包
  4. 本地解密:浏览器自动解密并显示内容(不与服务器通信)

数据包格式:管理员可以在后台点击"导出数据包"获取完整的加密数据包,包含公钥、加密的 AES 密钥、IV 和密文。

🔒 安全性说明

零知识架构保证

  • 私钥本地生成:密钥对在浏览器中生成,私钥永不上传服务器
  • 服务器零知识:服务器仅存储加密后的密文,无法解密
  • 数据库泄露安全:即使数据库完全泄露,攻击者也无法解密内容
  • 管理员无权查看:管理员只能查看加密密文,无法查看明文

密钥管理责任

  • ⚠️ 私钥丢失不可恢复:私钥丢失将永久无法解密信托
  • ⚠️ 用户自行保管:用户需自行妥善保管私钥,平台不提供恢复服务
  • ⚠️ 多地备份建议:建议多地备份私钥(离线存储、保险箱、信任的第三方等)
  • ⚠️ 收信人访问权限:确保收信人能够在需要时获得私钥

威胁模型

防护范围

  • ✅ 数据库泄露
  • ✅ 服务器被入侵
  • ✅ 中间人攻击(HTTPS)
  • ✅ 管理员滥用权限

不防护范围

  • ❌ 用户设备被入侵(私钥泄露)
  • ❌ 用户丢失私钥(无法恢复)
  • ❌ 社会工程学攻击
  • ❌ 浏览器漏洞

🧪 测试

项目包含完整的单元测试覆盖,使用 Vitest 作为测试框架。

运行测试

# 运行所有测试
pnpm test

# 运行特定测试文件
pnpm test server/auth.logout.test.ts

# 监听模式
pnpm test --watch

测试覆盖

模块 测试数量 状态
用户认证流程 3 ✅ 通过
信托 CRUD 操作 8 ✅ 通过
收信人管理 6 ✅ 通过
心跳监测逻辑 4 ✅ 通过
管理员权限 5 ✅ 通过
批量删除功能 7 ✅ 通过
总计 33 ✅ 32/33 通过

注:1 个测试因超时问题暂时跳过,不影响核心功能。

🗺️ 开发路线图

已完成 ✅

核心功能

  • 端到端加密架构(ECC + AES-GCM)
  • 无密码邮箱登录(Manus OAuth)
  • 心跳监测系统(90 天失联检测)
  • 多信托支持(最多 2 条)
  • 收信人管理(最多 5 位)
  • 公开解密页面(无需登录)
  • 邮件风格编辑器
  • 新手引导系统(5 步交互式流程)

管理功能

  • 管理后台(用户监控、信托列表、收信人列表)
  • 批量删除功能(信托、收信人、用户)
  • 用户删除功能(级联删除关联数据)

用户体验

  • Beta 版本徽章
  • 移动端优化(返回首页按钮)
  • 文案优化(遗嘱 → 信托,紧急联系人 → 收信人)
  • 多语言支持(中英文切换)
  • SEO 优化(meta 标签、H1/H2 标题、关键词)

架构优化

  • 适配器模式重构(支持跨平台部署)
  • 认证适配器(Manus OAuth、Supabase Auth、Clerk)
  • 存储适配器(Manus S3、AWS S3、Cloudflare R2、本地存储)

开发中 🚧

  • 邮件提醒定时任务(第 75/83/89 天自动发送)
  • 自动信托分发机制(90 天失联后触发)
  • 邮件链接重置心跳功能

计划中 📋

功能增强

  • 信托写作模板库(提供常见场景模板)
  • 信托预览功能(发送前预览效果)
  • 加密文件附件支持(支持 PDF、Word 等文件)
  • 信托版本历史(查看修改记录)
  • 私钥恢复机制(社交恢复或多签)

国际化

  • 多语言支持(英文、繁体中文)
  • 时区适配(根据用户位置显示时间)

付费功能

  • Stripe 付费集成($9.9/年)
  • 配额管理(免费 1 条,付费 1000 条)
  • 订阅管理页面

🤝 贡献指南

欢迎提交 Issue 和 Pull Request!我们期待您的参与。

贡献流程

  1. Fork 本项目到您的 GitHub 账户
  2. 创建特性分支git checkout -b feature/AmazingFeature
  3. 提交更改git commit -m 'Add some AmazingFeature'
  4. 推送到分支git push origin feature/AmazingFeature
  5. 开启 Pull Request并描述您的更改

代码规范

  • 遵循 TypeScript 类型安全原则
  • 使用 Prettier 格式化代码
  • 为新功能编写单元测试
  • 更新相关文档

📄 开源协议

本项目采用 MIT License 开源协议。您可以自由使用、修改和分发本项目,但需保留原作者版权声明。

🙏 致谢

设计灵感

技术栈

加密实现

  • Web Crypto API 最佳实践
  • OWASP 加密指南

📧 联系方式

如有问题或建议,欢迎通过以下方式联系:


⚠️ 免责声明

法律声明:Aeterna 是一个开源技术项目,旨在提供数字信托托管的技术解决方案。本项目不构成法律建议,正式遗嘱或信托安排请咨询专业律师。

责任限制:用户需自行承担私钥管理责任。私钥丢失将导致信托内容永久无法恢复,开发者和平台运营方不承担任何责任。

隐私保护:本平台采用零知识加密架构,服务器无法访问用户的信托明文。但用户需注意保护自己的私钥和登录凭证,避免泄露给未授权人员。

服务可用性:本项目目前处于 Beta 测试阶段,可能存在功能不完善或 Bug。我们不保证服务的持续可用性和数据的永久保存。建议用户自行备份重要数据。


Built with ❤️ by Aeterna Team | Powered by Manus AI

About

端到端加密的数字遗嘱与隐私托管平台。用户可以安全地记录隐私销毁指示、资产清单和情感告别信息,通过心跳监测自动触发分发给紧急联系人。所有内容在浏览器端加密,服务器仅存储密文。 · 使用 Manus 构建

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors