使用 Node.js 和 MySQL 在服务器上存储加密密钥

信息安全 加密 密钥管理 AES 密钥生成
2021-08-22 03:10:48

我正在使用 Node.js 和 MySQL 为 iOS 应用程序编写 Web 后端/api。在我的数据库中,我有一个帖子表。我希望对帖子内容进行加密。假设我正在使用这个AES 进行加密。

我希望能够安全地加密和解密服务器上的数据。来回发送到客户端的数据将未加密,但通过 HTTPS 发送(这是个好主意)?

我的问题:

  1. 我应该如何生成密钥?它们应该是随机字符串吗?

  2. 我应该在哪里存储密钥,因为每条消息都会有不同的密钥。

对抗模型
我想保护已经可以访问我的运行 https API(用 Node.js 编写)的服务器并可以访问我的 MySQL 数据库的人。我想反对那个人能够解密该表中的加密数据。所以重要的是,即使他们有大量的加密数据,而且加密的工作方式仍然无法解密数据。

1个回答

希望我能正确理解这一点。客户端通过 SSL 加密连接向服务器发送消息。服务器获取消息并将其存储在数据库中。您担心如果有人闯入服务器,他们可以读取数据库并查看所有消息。

因此,加密似乎是天作之合。在将消息存储到数据库之前加密消息(每条消息使用不同的密钥)。现在的问题是,如何处理密钥。您不能将它们存储在服务器上,因为攻击者在服务器上。他们可以轻松找到密钥、提取整个数据库并解密所有内容。

看来您最好的选择是将密钥存储在另一台机器上,然后让该机器进行加密/解密。这样,攻击者首先必须闯入您的机器,然后进入加密/解密机器。并非不可能,但希望更难。

另一种选择是一些加密硬件。这超出了我的专业知识,但公司销售执行加密操作的硬件,包括密钥存储、加密和解密。

这是棘手的部分。是什么阻止了攻击者反复查询另一台机器或加密硬件,直到他解密了所有消息?你必须在那里建立某种检测或类似的东西。

简而言之,考虑到你的对手模型(在盒子上具有 root 权限的攻击者),这个问题是相当困难的。希望这两个选项之一对您有用,或者至少产生一些其他答案。