You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Telegram Bot实现消息加密存储直至触发/sendEmail命令?

嘿,这个需求完全可以实现,核心思路就是用端到端加密(E2EE)+ 延迟解密的方式,确保只有用户自己能解密消息,开发者全程碰不到明文内容。下面给你详细的可行方案和实现步骤:

核心实现思路

我们的目标是:Bot只存储加密后的消息密文,从不保留用户的解密密钥;只有当用户触发/sendEmail并提供正确密钥时,才临时解密消息并发送邮件,完成后立即清理相关数据。

1. 密钥与加密流程设计

1.1 密钥派生(提升弱密码安全性)

用户输入的密钥可能是简单密码,直接用它加密不够安全。我们可以用**密钥派生函数(KDF)**来生成安全的加密密钥:

  • 当用户第一次发送密钥时,Bot生成一个随机的盐(Salt)(这个盐可以和密文一起存储,不需要保密)。
  • 用Argon2或者PBKDF2算法,将用户提供的密钥+盐派生为一个256位的AES密钥——这才是我们实际用来加密消息的密钥。

1.2 消息加密存储

  • 用户发送的每条普通消息,Bot都用上述派生的AES密钥(配合随机生成的IV初始化向量),通过AES-256-GCM算法加密(GCM模式自带完整性校验,能防止密文被篡改)。
  • 将加密后的密文、盐、IV、用户ID、消息顺序号这些信息存储到数据库(比如SQLite、Redis),但绝对不能存储用户的明文密钥或派生后的AES密钥。
  • 如果用户后续继续发送消息,只要没有更新密钥,就用同一个盐+用户密钥派生的AES密钥加密即可;如果用户更新密钥,就生成新的盐,用新密钥派生新的AES密钥,后续消息用新密钥加密(旧消息仍用旧密钥,解密时需要用户提供对应密钥)。

2. 解密与邮件发送流程

当用户发送/sendEmail命令时:

  1. Bot先提示用户提供解密密钥:请发送你的加密密钥,我将用它解密你的消息并发送邮件。
  2. 用户发送密钥后,Bot从数据库取出该用户的所有密文记录(包含盐、IV)。
  3. 用用户提供的密钥+每条记录的盐,重新派生对应的AES密钥,再配合IV解密每条密文。
  4. 把解密后的所有明文按顺序拼接成完整内容,调用邮件API发送到指定邮箱。
  5. 发送完成后,立即删除该用户在数据库中的所有密文记录,避免数据残留。

3. 优化用户体验的细节

  • 可以允许用户提前设置密钥(比如用/setKey [你的密钥]命令),这样后续发送消息时无需重复提示,Bot直接用已设置的密钥(内存临时持有,不持久化)加密消息。但要注意:如果Bot重启,用户需要重新发送密钥,因为内存中的密钥会丢失——这也是安全的一部分。
  • 如果用户忘记密钥,Bot无法解密消息,直接提示用户密钥错误,并可以选择删除该用户的所有密文记录,让用户重新开始。
  • 可以设置自动清理机制,比如超过7天未触发/sendEmail的用户密文,自动从数据库删除,避免存储冗余数据。

4. 关键安全注意事项

  • 永远不要存储用户的明文密钥,也不要存储派生后的AES密钥,只存密文、盐、IV这些非敏感元数据。
  • 每次加密都要生成新的随机IV,不能重复使用IV,否则会降低加密安全性。
  • 解密失败时,只提示“密钥错误”,不要泄露任何关于密文的信息(比如密文长度、是否部分解密成功),防止攻击者暴力破解。
  • 数据库要做好权限控制,避免被未授权访问。

内容的提问来源于stack exchange,提问作者A_A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:44:18