在我的数据库中保存用户数据库连接

时间:2021-01-20 12:37:04

标签: mysql node.js security authentication typeorm

我正在开发一个应用程序,我必须在其中创建一个到我自己的数据库的连接,以及一个到数据库的连接,其中包含用户必须在自己的注册中提供的访问信息。

我们正在开发一个独特的应用程序,它应该为多个客户提供服务,在后端使用带有 typeORM 的节点。

我知道对于我的连接,我可以使用我自己应用程序中的 .env。

但是根据用户提供的连接,我知道我无法在数据库中使用纯文本进行保存。

那么问题是:把这个保存到mysql数据库可以吗?

如何以最安全的方式保存这些数据?

2 个答案:

答案 0 :(得分:2)

您的系统设计存在一些不寻常的信息安全隐患。它有一个比平常更大的 attack surface,因为它要求您的客户将他们的 MySQL 服务器暴露给来自您服务器的连接。如果您的服务器可以进入,那么网络蠕虫很可能也会更容易进入。如果他们的数据是敏感的,他们可能会要求您在他们的环境和您的环境之间使用始终在线的 VPN 隧道访问他们的服务器。怎么做?超出了 Stack Overflow 答案的范围。

您可以采取一些措施使其更安全。

首先,让您的客户要求 ssl-encrypted MySQL connections 从您的 nodejs 程序到您的客户提供的 MySQL 实例。您不希望您的客户的数据在没有加密的情况下通过公共网络移动,因为您不希望网络蠕虫拦截或更改它。这需要您的客户配置他们的服务器以支持 TLS。

其次,告诉您的客户在他们的服务器上创建 MySQL 帐户,专门供您的应用程序使用。这些帐户应该具有您的应用程序运行所需的最低权限。要求您的客户限制这些帐户对您服务器的访问。例如,如果您服务器的 IP 地址是 192.0.2.123192.0.2.124192.0.2.125,您可以要求他们create accounts like this

 CREATE USER 'rodrigo'@'192.0.2.123' IDENTIFIED BY 'hardToGuess' REQUIRE SSL;
 CREATE USER 'rodrigo'@'192.0.2.124' IDENTIFIED BY 'hardToGuess' REQUIRE SSL;
 CREATE USER 'rodrigo'@'192.0.2.125' IDENTIFIED BY 'hardToGuess' REQUIRE SSL;
 GRANT SELECT,INSERT,UPDATE,DELETE ON rodrigoAppDb.* TO
    'rodrigo'@'192.0.2.123',
    'rodrigo'@'192.0.2.124',
    'rodrigo'@'192.0.2.125';
 FLUSH PRIVILEGES; 

第三,让我们利用有关对您的应用程序进行密码身份验证的事实。如果您正确地进行了密码验证,那么只有当他们从您的登录表单和 you check them 向您发送密码时,您才能访问 用户的未散列的登录密码。因为您对用户的密码进行了哈希处理,所以它们不会以可用的形式存储在您的 MySQL 数据库中。

这意味着您可以使用他们的登录密码(他们的纯文本登录密码本身,而不是他们登录密码的哈希)作为他们的密钥来加密您客户的 MySQL 密码。这样您就不必存储这些密码的文本。您需要在登录序列期间检索和解密他们的 MySQL 密码。然后,您可以打开每个用户的 MySQL 数据库的连接池,以便在该用户的会话期间使用。 (请务必为每个池设置一个较短的过期时间,以便在您的用户离开后它很快就会消失。)

请注意:当您的用户更改密码时,您必须更新他们的密码哈希值并重新加密他们的数据库密码。这意味着您必须在密码更新页面上提示输入用户的现有密码和新密码。

同样,您需要一个屏幕,您可以在其中接受每个用户的 MySQL 连接数据。在该屏幕上,您还必须向系统重新请求用户密码。

答案 1 :(得分:0)

以纯文本形式保存用户的关键信息从来都不是一个好主意。您可以使用某种用户相关的密钥和组织的盐来加密数据,然后将该信息保存在数据库中。请勿保存密码并在用户登录时询问,以免您最终滥用此数据。

相关问题