【问题标题】:Save user database connection in my database在我的数据库中保存用户数据库连接
【发布时间】:2021-04-24 19:51:13
【问题描述】:

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

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

我知道我可以使用自己应用程序中的 .env 进行连接。

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

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

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

【问题讨论】:

    标签: mysql node.js security authentication typeorm


    【解决方案1】:

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

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

    首先,让您的客户要求从您的 nodejs 程序到客户提供的 MySQL 实例中的 ssl-encrypted MySQL connections。您不希望您的客户数据在没有加密的情况下通过公共网络移动,因为您不希望网络窃贼拦截或更改它。这需要您的客户将其服务器配置为支持 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 连接数据。在该屏幕上,您还必须重新向系统请求用户密码。

    【讨论】:

    • 非常感谢您的回复。我还有一个关于使用用户密码哈希进行密码加密的问题。如果用户更改了他的密码,或者由于其他原因他的密码哈希发生了变化,是否可以使用新的哈希继续解密 mysql 访问数据?还是他必须重新加密他的数据库访问数据?
    • 请查看我对答案的补充。
    • 好的,我会和我的团队讨论这个解决方案,非常感谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多