如何在我的网站上存储聊天对话?

信息安全 加密 Web应用程序
2021-08-18 10:45:07

我正在制作一个会员可以进行一对一聊天的网站,但我不确定应该如何处理对话文本。我应该将文本存储在 .txt 文件中还是直接存储在数据库中?

我还想知道是否应该以某种方式加密文本,这样如果有人通过数据库,他或她就不会得到我成员对话的明文。我网站上的会员注册是为了和其他人一起玩,所以我认为他们的谈话中没有任何超级秘密的东西。但是,我只是想添加那一层安全性,同时获得经验,如果我将来需要对用户提交的文本保密。

3个回答

它不是特别干净、高效或简单,但有一个方案可以为您做到这一点。

  1. 为每个用户生成一个 RSA 密钥对。
  2. 使用密钥派生函数(例如 PBKDF2)从用户密码生成存储密钥
  3. 使用存储密钥使用 AES 加密私钥。
  4. 使用存储密钥作为 HMAC 密钥,计算公钥和私钥的 HMAC-SHA256 哈希。
  5. 将这些值存储在数据库中。

从 Alice 向 Bob 发送消息时,请执行以下操作:

  1. Alice 生成一个消息密钥并使用 Bob 的公钥对其进行加密。
  2. Alice 使用消息密钥加密她的消息。
  3. Alice 使用她的密码计算她的存储密钥。她使用它来解密她的私钥,然后验证 HMAC-SHA256 哈希是否与他的公钥和私钥匹配。
  4. Alice 将加密消息和加密密钥连接成一个密文,并使用她自己的私钥对其进行签名。
  5. Alice 将密文发送给 Bob。

当 Bob 想要阅读消息时:

  1. Bob 使用他的密码计算他的存储密钥。他使用它来解密他的私钥,然后验证 HMAC-SHA256 散列是否匹配他的公钥和私钥。
  2. Bob 使用他的私钥解密 Alice 的消息密钥。
  3. Bob 使用消息密钥来解密消息。
  4. Bob 通过使用 Alice 的公钥验证数字签名来验证消息。

该方案具有以下性质:

  • 在不知道用户密码的情况下,无法解密从数据库捕获的消息。
  • 在不知道用户密码的情况下无法解密私钥。
  • 每条消息都使用独立的密钥进行加密。
  • 具有数据库写入权限的攻击者可以通过替换用户的公钥来伪造来自用户的消息,但是发送用户在登录时会收到警告,因为 HMAC 哈希不匹配。

如果最终的安全考虑有问题,请考虑在每条消息中发送发件人公钥的摘要。这样,如果在任何时候发生合法对话,系统可以根据之前对话中发送的摘要来验证公钥。

不用担心加密。它是在 .txt 文件中还是在数据库中都没有关系(从安全角度来看)。相反,您可以为用户的安全和隐私做的最重要的事情是:

保留数据的时间不要超过您绝对需要的时间!

人们对聊天有一定的期望。他们期望在线聊天就像离线聊天(在您的门廊或其他地方):没有定期保存所有聊天的永久记录。人们可能希望聊天通常保持私密。所以,不要违背他们的期望。不要保留他们的聊天记录。在一段合理的时间后删除所有记录(例如,一天后;或尽快)。然后,如果您受到攻击,损失将是适度的,您不必与您的用户正面交锋,承认黑客已经获得了他们过去所有聊天记录的访问权限,并且一直如此。

聊天应该被加密,即使只是轻微的加密,以使其不被查看。同样删除超过一个月或日志超过 300 行左右的行,如果数据库和解密密钥被泄露,他们的隐私将受到一定程度的保护。用户可能希望保存聊天(我愿意),所以最好是给他们一个选项来存储它更长的时间,并下载将从服务器中删除的任何内容。

我不确定用用户密码加密它是否有用。它甚至可能使攻击者更容易,通过 SQL 注入,他可能能够查看用户的密码。硬编码的解密密钥将提供第二个因素;受损的数据库是不够的。然而,当服务器被入侵时,总是可以找到解密密钥(当数据库被破坏时,这可能更容易做到,尤其是当攻击者可以写入数据库时​​),因此不能完全依赖它。

真正保护用户聊天的唯一方法是生成私钥和公钥对,让用户下载私钥而不保留副本。可以使用私钥解密聊天(需要在从数据库加载任何聊天时输入),使用公钥可以加密和存储聊天。不过,这可能是不切实际的,而且工作量太大。