如何基于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命令时:
- Bot先提示用户提供解密密钥:
请发送你的加密密钥,我将用它解密你的消息并发送邮件。 - 用户发送密钥后,Bot从数据库取出该用户的所有密文记录(包含盐、IV)。
- 用用户提供的密钥+每条记录的盐,重新派生对应的AES密钥,再配合IV解密每条密文。
- 把解密后的所有明文按顺序拼接成完整内容,调用邮件API发送到指定邮箱。
- 发送完成后,立即删除该用户在数据库中的所有密文记录,避免数据残留。
3. 优化用户体验的细节
- 可以允许用户提前设置密钥(比如用
/setKey [你的密钥]命令),这样后续发送消息时无需重复提示,Bot直接用已设置的密钥(内存临时持有,不持久化)加密消息。但要注意:如果Bot重启,用户需要重新发送密钥,因为内存中的密钥会丢失——这也是安全的一部分。 - 如果用户忘记密钥,Bot无法解密消息,直接提示用户密钥错误,并可以选择删除该用户的所有密文记录,让用户重新开始。
- 可以设置自动清理机制,比如超过7天未触发
/sendEmail的用户密文,自动从数据库删除,避免存储冗余数据。
4. 关键安全注意事项
- 永远不要存储用户的明文密钥,也不要存储派生后的AES密钥,只存密文、盐、IV这些非敏感元数据。
- 每次加密都要生成新的随机IV,不能重复使用IV,否则会降低加密安全性。
- 解密失败时,只提示“密钥错误”,不要泄露任何关于密文的信息(比如密文长度、是否部分解密成功),防止攻击者暴力破解。
- 数据库要做好权限控制,避免被未授权访问。
内容的提问来源于stack exchange,提问作者A_A
相关产品推荐
相关产品推荐

