端到端加密消息应用方案:高级设计和架构

简单介绍一下自己:我做自由网页开发人员已有大约 1.5 年了。我从未考虑过写 HLD 或 LLD。相反,我专注于根据客户的具体要求开发应用程序。由于我渴望过渡到企业环境,因此我渴望提高自己的技能并获取新知识。

以下是我尝试编写的 HLD

**客户要求**:基于 Web 的 E2EE 聊天应用程序。可随时扩展到 1000 个并发用户。

系统架构

该应用程序主要由前端(react)、后端(Node)、数据库(Redis 和 SQL)组成。

  • 前端:管理用户看到的内容,处理用户登录、用户注册。处理发送和接收消息。响应式设计。
  • 后端:管理消息和登录的内容和方式,负责管理登录/注册,负责存储消息和用户数据,处理页面路由
  • 数据库:存储加密消息和用户数据/登录信息
  • WebSocket 服务器:用于用户之间实时双向通信的专用服务。
  • 缓存层(可选):使用 Redis 临时缓存活跃用户、消息队列或在线状态以提高性能。
  • 高级流程

  • 用户通过前端登录→后端对用户进行身份验证。
  • 前端与后端建立WebSocket连接,实现实时通信。
  • 当用户发送消息时:WebSocket 服务器接收该消息。它处理该消息并将其路由至预期收件人。后端将消息存储在数据库中。
  • 接收者通过WebSocket连接实时接收消息。
  • 架构图

    Basic Architecture Image

    数据流

  • 注册流程 用户创建账户 生成公共和私有哈希值 公共哈希值与用户信息一起存储在数据库中。成功后:成功消息重定向到登录
  • 登录流程 用户被提示使用电子邮件和密码登录。输入后,后台将验证数据。成功后:用户重定向到聊天室 拒绝后:会弹出一个窗口通知用户哪里出错了。
  • 房间消息流 用户加入房间:前端将房间 ID 发送到后端。 joinRoom 事件被编辑到特定房间。 房间内的消息:全局房间消息目前尚未加密,它们只是共享并存储在数据库中。实时传递给房间内的所有参与者。
  • 用户 - 用户消息流前端:前端使用收件人的公钥加密消息。加密消息通过套接字与后端共享。后端:将消息存储在 PSQL 中,使用用户 ID 将消息路由给用户,收件人前端解密消息
  • 详细示例流程

    实时直接消息流

  • 前端:用户通过 WebSocket 向另一个用户发送消息。消息在传输前使用收件人的公钥加密。
  • 后端:WebSocket 服务器接收加密消息。消息与元数据(例如发送者、接收者、时间戳)一起存储在 PostgreSQL 中。后端将加密消息路由到接收者的 WebSocket 连接。
  • 收件人前端:通过 WebSocket 接收加密消息。使用私钥解密消息。明文消息显示在聊天中。
  • High Level Architect Image

    技术堆栈

  • 前端:React:构建用户界面(聊天窗口、按钮、输入框)。Context API 或 Redux:管理应用状态(例如,当前用户、活跃聊天)。GSAP:用于动画(例如,聊天气泡平滑滑动)。WebSocket 客户端:与后端建立实时连接。
  • 后端:Node.js + Express.js:处理 REST API(用于登录、注册、获取消息)。JWT(JSON Web Tokens):使用基于 token 的身份验证保护通信。Passport.js:实施身份验证策略(例如,Google 或 Facebook 登录)。Socket.IO:处理用于实时消息传递的 WebSocket 连接。
  • 数据库:PostgreSQL:用于存储持久数据,如用户个人资料、消息和聊天室详细信息。Redis(可选):用于缓存实时数据(例如,活动用户状态、最近发送的消息)。
  • 托管和部署:AWS(EC2、S3、RDS):托管后端、存储静态文件和管理数据库。Nginx 或 AWS ELB(负载均衡器):在后端服务器之间分配流量。
  • 非功能性需求(NFR)

  • 性能:目标实时消息延迟低于 100 毫秒。确保 1,000 多名用户的一致读/写操作。
  • 可扩展性:后端应通过水平扩展来处理不断增长的用户数量(例如,使用 Redis 和 AWS ELB)。每台服务器支持 10,000 个活动 WebSocket 连接。
  • 可用性:通过备份和灾难恢复确保 99.9% 的正常运行时间。
  • 安全性:使用 E2EE 进行私人消息传递。对所有传输中的数据使用 HTTPS。确保静态数据在 PostgresSQL 中加密。
  • 总结

    构建可扩展且安全的端到端加密消息传递应用程序需要在性能、可用​​性和安全性之间取得平衡。通过此高级设计,我旨在展示现代消息传递系统的架构和流程,该系统能够处理实时通信,同时确保用户隐私。

    该项目不仅展示了前端的 React、后端的 Node.js 和数据管理的 PostgreSQL/Redis 等关键技术技能,而且还强调了可扩展性和可靠性设计的重要性。

    如果您是一名开发人员或爱好者,有兴趣创建强大的系统或进一步探索实时通信架构,我希望本文能为您提供有价值的见解。

    我很乐意听听您的想法或反馈!欢迎随时联系我们、分享您的想法或在评论部分提问。让我们继续学习和建设!

    请继续关注我的法学博士学位!

    每个项目都让我离掌握软件开发技巧更近一步。这个项目让我明白了平衡功能和可扩展性的重要性,我期待将来能构建更复杂的系统!