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



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

我们正在开发一个独特的应用程序,它应该服务于多个客户,在后端使用节点w/typeORM。

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

但是用户提供的连接,我知道我不能在数据库中使用纯文本保存。

所以问题是:是否可以将其保存到mysql数据库?

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

你的系统设计存在一些不寻常的信息安全隐患。它具有比通常更大的攻击面,因为它要求您的客户将其MySQL服务器暴露给来自您的服务器的连接。如果你的服务器可以进入,网络爬虫也很可能更容易进入。如果他们的数据很敏感,他们可能会要求您在他们的环境和您的环境之间使用始终在线的VPN隧道访问他们的服务器。怎么做呢?超出了堆栈溢出回答的范围。

你可以采取一些措施使它更安全。

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

第二,告诉你的客户在他们的服务器上专门为你的应用程序创建MySQL帐户。这些帐户应该拥有应用程序运行所需的最低权限。要求您的客户限制这些帐户访问您的服务器。例如,如果您的服务器的IP地址是192.0.2.123,192.0.2.124192.0.2.125,您可以要求他们创建这样的帐户:

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; 

第三,让我们利用关于应用程序密码身份验证的一个事实。如果您正确地进行了密码验证,那么您唯一能够访问您的用户的未散列登录密码的时间是当他们从您的登录表单中将密码发送给您并且您检查它们时。因为你散列了用户的密码,所以他们不会以可用的形式存储在MySQL数据库中。

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

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

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

以纯文本形式保存用户的关键信息从来都不是一个好主意。您可以使用某种与用户相关的密钥对数据进行加密,并为您的组织设置salt,然后将该信息保存在数据库中。请不要保存密码,并在用户登录时询问密码,以免这些数据在您的终端被滥用。

最新更新